Question

Hi take the following data as an example

id | value
----------
 A |   3
 A |   9
 B |   7
 B |   2
 C |   4
 C |   5

I want to list out all the data base on the min value of each id group, so that the expected output is

id | value
----------
 B |   2
 B |   7
 A |   3
 A |   9
 C |   4
 C |   5

i.e. min of group A is 3, group B is 2, group C is 4, so group B first and then the rest of group B in ascending order. Next group A and then group C

I tried this but thats not what I want

SELECT * FROM (
SELECT 'A' AS id, '3' AS value
UNION SELECT 'A', '9' UNION SELECT 'B', '7' UNION SELECT 'B', '2'
UNION SELECT 'C', '4' UNION SELECT 'C', '5') data
GROUP BY id, value
ORDER BY MIN(value)

Please help! Thank you

Was it helpful?

Solution

SELECT * FROM (
SELECT 'A' AS id, '3' AS value
UNION SELECT 'A', '9' UNION SELECT 'B', '7' UNION SELECT 'B', '2'
UNION SELECT 'C', '4' UNION SELECT 'C', '5') data
ORDER BY MIN(value) OVER(PARTITION BY id), id, value

OVER Clause (Transact-SQL)

Add the over() clause to your query output and you can see what it does for you.

SELECT *, 
       MIN(value) OVER(PARTITION BY id) OrderedBy FROM (
SELECT 'A' AS id, '3' AS value
UNION SELECT 'A', '9' UNION SELECT 'B', '7' UNION SELECT 'B', '2'
UNION SELECT 'C', '4' UNION SELECT 'C', '5') data
ORDER BY MIN(value) OVER(PARTITION BY id), id, value

Result:

id   value OrderedBy
---- ----- ---------
B    2     2
B    7     2
A    3     3
A    9     3
C    4     4
C    5     4
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top