2013-05-09 6 views
6

Vorrei raggruppare i risultati di una colonna (NOME), quindi ordinare da una seconda colonna (NOTA) per ciascun gruppo e infine ordinare i gruppi per la NOTA più alta che hanno.Ordine dal valore massimo nel gruppo

Quindi, se i miei soggetti sono criptati come questi:

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

Io li vorrei essere ordinati in questo modo:

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

raggruppate per nome, con Andrew che appare prima di tutto perché la sua nota più alta ha 19 anni, poi Thomas (18) e Frank (16).

saluti,

Val

risposta

3

Ecco un modo per farlo utilizzando funzioni finestra:

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

Oltre ad ordinare dal MAXNOTE, ma ha anche ordini da parte il nome. Se ci sono legami, mantiene tutti i record per un determinato nome insieme.

+0

+1 è possibile fare riferimento a un alias afer 'ordine by', quindi non è necessario per la subquery – Andomar

+0

@Andomar. . . Se fosse scritto in quel modo, allora "maxnote" dovrebbe essere nell'output. –

+0

@GordonLinoff Bello, il maxnote nell'ordine dovrebbe avere 'desc' dopo di esso, ma bella soluzione. –

3

CTE risposta ...

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 

Questo è il modo più semplice, utilizzando PARTITION BY è la sintassi solo leggermente più e su tavoli più grandi sarebbe probabilmente un funzionamento più efficiente.

0

modo molto semplice:

selezionare il nome, nota NameNoteTable Ordinare per Nome asc, nota disc

+1

Questa query ordina alfabeticamente la colonna 'name'. Nella domanda, la colonna 'name' dovrebbe essere ordinata in base all'ordine decrescente di' note' per utente – KartikKannapur