Pergunta

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

Foi útil?

Solução

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top