2013-05-09 63 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