2013-05-09 53 views
6

我想按一列(NAME)對結果進行分組,然後按第二列(NOTE)對每組進行排序,最後按照它們的最高記錄排序組。按組中的最大值排序

所以,如果我的實體炒這樣的:

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

我想他們訂購這樣的:

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

按名稱分組,與安德魯出現首先是因爲他的最高音符是19歲,然後是托馬斯(18歲)和弗蘭克(16歲)。

問候,

瓦爾

回答

3

這是一種利用窗口函數來做到這一點:

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

除責令由maxnote,它也通過訂單的名稱。如果有聯繫,那麼它將所有記錄保存在一起。

+0

+1你可以參考一個別名AFER'爲了by',因此無需子查詢 – Andomar 2013-05-09 16:00:11

+0

@Andomar。 。 。如果是這樣寫的,那麼'maxnote'必須在輸出中。 – 2013-05-09 16:04:16

+0

@GordonLinoff不錯,在順序中的maxnote應該有'desc',但是很好的解決方案。 – 2013-05-09 16:05:36

3

CTE答案...

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 

這是最簡單的方法,使用PARTITION BY只是稍微語法和較大的表可能會更有效地運行。

0

非常簡單的方法:

選擇的名字,從NameNoteTable 爲了說明名稱遞增,注意遞減

+1

該查詢按字母順序排列「name」列。在這個問題中,'name'列應該根據每個用戶的'note'降序排列 – KartikKannapur 2016-08-02 11:26:28