2013-05-09 16 views
6

Chciałbym pogrupować wyniki według jednej kolumny (NAZWA), następnie zamówić przez drugą kolumnę (UWAGA) dla każdej grupy, a na końcu zamówić grupy według najwyższego UWAGA, że mają.Zamówienie według maksymalnej wartości z grupy

Więc jeśli moje podmioty są kodowane, takie jak:

NAME   NOTE 
Andrew  19 
Thomas  18 
Andrew  18 
Andrew  17 
Frank  16 
Frank  15 
Thomas  14 
Thomas  12 
Frank  5 

bym je lubią być uporządkowane tak:

NAME   NOTE 
Andrew  19 
Andrew  18 
Andrew  17 
Thomas  18 
Thomas  14 
Thomas  12 
Frank  16 
Frank  15 
Frank  5 

pogrupowane według nazwy, z Andrew pojawiać pierwsze dlatego jego najwyższej noty jest 19, następnie Thomas (18) i Frank (16).

Pozdrawiam,

Val

Odpowiedz

3

Oto sposób to zrobić przy użyciu funkcji okna:

select name, note 
from (select t.*, max(note) over (partition by name) as maxnote 
     from t 
    ) t 
order by maxnote desc, name 

Oprócz złożenia przez maxnote, ale także zlecenia według nazwy. Jeśli istnieją więzi, zachowuje wszystkie rekordy dla danej nazwy.

+0

+1 Można odwołać się do aliasu afer 'kolejności by', więc nie ma potrzeby podkwerendzie – Andomar

+0

@Andomar. . . Jeśli został napisany w ten sposób, to 'maxnote' musiałby być na wyjściu. –

+0

@GordonLinoff Nice, maxnote w kolejności przez powinien mieć 'desc' po nim, ale ładne rozwiązanie. –

3

CTE odpowiedź ...

Create Table NameNoteTable (Name Varchar(10), Note Int); 

Insert NameNoteTable 
Select 'Andrew', 19 
Union All 
Select 'Andrew', 18 
Union All 
Select 'Andrew', 17 
Union All 
Select 'Thomas', 18 
Union All 
Select 'Thomas', 14 
Union All 
Select 'Thomas', 12 
Union All 
Select 'Frank', 16 
Union All 
Select 'Frank', 15; 

With cte As 
(
     Select Row_Number() Over (Order By Max(Note) Desc) As tID, 
       Name, 
       Max(Note) As MaxNote 
     From NameNoteTable 
     Group By Name 
) 
Select nnt.Name, nnt.Note 
From NameNoteTable nnt 
Join cte c 
     On nnt.Name = c.Name 
Order By tID, Note Desc; 
1
SELECT t.name, t.note 
FROM @tbl t 
ORDER BY (SELECT MAX(note) FROM @tbl WHERE name = t.name) DESC 
     , name 
     , note DESC 

Jest to najprostszy sposób, używając partycję jest tylko nieznacznie bardziej składnia i na większych stołach będzie prawdopodobnie działać sprawniej.

0

bardzo prosty sposób:

select nazwa, notatka z NameNoteTable kolejności według nazwy asc, uwaga desc

+1

To zapytanie porządkuje kolumnę 'name' alfabetycznie. W pytaniu kolumna 'name' powinna być uporządkowana według malejącej kolejności' note' na użytkownika – KartikKannapur

Powiązane problemy