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)。

问候,

瓦尔

4

4 回答 4

4

这是使用窗口函数的一种方法:

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

除了按 maxnote 排序外,它还按名称排序。如果存在联系,则它将给定名称的所有记录保存在一起。

于 2013-05-09T15:56:30.973 回答
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;
于 2013-05-09T16:02:18.967 回答
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 只是稍微多一些语法,并且在更大的表上可能会更有效地运行。

于 2013-05-09T16:40:44.900 回答
0

很简单的方法:

select name, note from NameNoteTable 按名称 asc, note desc

于 2016-08-02T11:15:42.013 回答