如何在group by中排序值

Lu4*_*Lu4 5 sql sql-server greatest-n-per-group

请考虑以下SQL Server表:

  ID  |   X   |   Y
------+-------+-------
   1  |   1   |   1
   2  |   1   |   2
   3  |   1   |   3
   4  |   2   |   40
   5  |   2   |   500
   6  |   3   |   1
   7  |   3   |   100
   8  |   3   |   10
Run Code Online (Sandbox Code Playgroud)

我需要选择Y的最大值为Y的行的ID,即:

  ID  |   X   |   Y
------+-------+-------
   3  |   1   |   3
   5  |   2   |  500
   7  |   3   |  100
Run Code Online (Sandbox Code Playgroud)

查询将嵌套多次,因此需要最佳性能解决方案......

Ale*_*Aza 4

设置:

 declare @MyTable table(ID int, X int, Y int)

 insert @MyTable
 values
    (   1  ,   1   ,   1),
    (   2  ,   1   ,   2),
    (   3  ,   1   ,   3),
    (   4  ,   2   ,   40),
    (   5  ,   2   ,   500),
    (   6  ,   3   ,   1),
    (   7  ,   3   ,   100),
    (   8  ,   3   ,   10)
Run Code Online (Sandbox Code Playgroud)

询问:

;with cte
as
(
    select *, row_number() over(partition by X order by Y desc) RowNumber
    from @MyTable
)
select Id, X, Y
from cte
where RowNumber = 1
Run Code Online (Sandbox Code Playgroud)

结果:

Id          X           Y
----------- ----------- -----------
3           1           3
5           2           500
7           3           100
Run Code Online (Sandbox Code Playgroud)

该查询适用于 MS SQL 2005+。该设置适用于 MS SQL 2008+。