snippetsqlMinor
How to get a column A which has the smaller column B grouping by column C?
Viewed 0 times
thecolumngroupinghasgetsmallerhowwhich
Problem
I'd like to get the ID of a dataset for each category (my grouping column) which has the smallest "order" column.
Here a set of data to explain my thoughts:
Result expected:
Bonus question, how to retrieve just one ID even if there's some duplicates for the "order" column (ORD) ?
Result expected (using a MIN for example or other suggestion):
Oracle or MySQL queries are welcomed, thanks a lot.
Here a set of data to explain my thoughts:
CREATE TABLE DATAS (
ID INT(2) ,
CATEGORY INT(2) ,
ORD INT(1)
);
INSERT INTO DATAS (ID, CATEGORY, ORD)
VALUES (1, 1, 3), (2, 1, 2), (3, 1, 1), (4, 2, 1), (5, 2, 2);Result expected:
ID CATEGORY
-------------
3 1
4 2Bonus question, how to retrieve just one ID even if there's some duplicates for the "order" column (ORD) ?
INSERT INTO DATAS (ID, CATEGORY, ORD)
VALUES (1, 1, 3), (2, 1, 2), (3, 1, 1), (4, 2, 1), (5, 2, 1), (6, 3, NULL), (7, 3, NULL);Result expected (using a MIN for example or other suggestion):
ID CATEGORY
-------------
3 1
4 2
6 3Oracle or MySQL queries are welcomed, thanks a lot.
Solution
Oracle solution to both problems:
Generic solution to both problems:
Oracle DDL/DML:
SELECT ID, Category FROM (
SELECT FIRST_VALUE(ID) OVER
(PARTITION BY Category ORDER BY Ord) IDOfSmallestOrdForCategory
, Category, ID FROM DATAS
)
WHERE ID = IDOfSmallestOrdForCategory;Generic solution to both problems:
SELECT MIN(a.ID), a.Category FROM DATAS a
JOIN (SELECT CATEGORY, COALESCE(MIN(ORD),0) MINORD FROM DATAS GROUP BY CATEGORY) b
ON COALESCE(a.ORD,0) = b.MINORD AND a.Category = b.Category
GROUP BY a.Category;Oracle DDL/DML:
CREATE TABLE DATAS (
ID Integer,
CATEGORY Integer,
ORD Integer
);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (1, 1, 3);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (2, 1, 2);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (3, 1, 1);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (4, 2, 1);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (5, 2, 2);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (1, 1, 3);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (2, 1, 2);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (3, 1, 1);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (4, 2, 1);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (5, 2, 1);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (6, 3, NULL);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (7, 3, NULL);Code Snippets
SELECT ID, Category FROM (
SELECT FIRST_VALUE(ID) OVER
(PARTITION BY Category ORDER BY Ord) IDOfSmallestOrdForCategory
, Category, ID FROM DATAS
)
WHERE ID = IDOfSmallestOrdForCategory;SELECT MIN(a.ID), a.Category FROM DATAS a
JOIN (SELECT CATEGORY, COALESCE(MIN(ORD),0) MINORD FROM DATAS GROUP BY CATEGORY) b
ON COALESCE(a.ORD,0) = b.MINORD AND a.Category = b.Category
GROUP BY a.Category;CREATE TABLE DATAS (
ID Integer,
CATEGORY Integer,
ORD Integer
);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (1, 1, 3);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (2, 1, 2);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (3, 1, 1);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (4, 2, 1);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (5, 2, 2);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (1, 1, 3);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (2, 1, 2);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (3, 1, 1);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (4, 2, 1);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (5, 2, 1);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (6, 3, NULL);
INSERT INTO DATAS (ID, CATEGORY, ORD) VALUES (7, 3, NULL);Context
StackExchange Database Administrators Q#3259, answer score: 6
Revisions (0)
No revisions yet.