如何在group by中对值进行排序

问题描述

|| 考虑以下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
我需要选择具有x分组的Y最大值的行的ID,即:
  ID  |   X   |   Y
------+-------+-------
   3  |   1   |   3
   5  |   2   |  500
   7  |   3   |  100
查询将嵌套多次,因此需要最佳性能解决方案。     

解决方法

        设定:
 declare @MyTable table(ID int,X int,Y int)

 insert @MyTable
 values
    (   1,1,1),(   2,2),(   3,3),(   4,2,40),(   5,500),(   6,3,(   7,100),(   8,10)
查询:
;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
结果:
Id          X           Y
----------- ----------- -----------
3           1           3
5           2           500
7           3           100
该查询适用于MS SQL 2005+。 该设置将在MS SQL 2008+中运行。     ,        是的,很多时候都是这种类型的问题...添加了关键字\“ STRAIGHT_JOIN \”,可以通过先执行\“ PreQuery \”来预先优化查询。
select STRAIGHT_JOIN
      YT.*
   from 
      ( select x,max(y) HighPerX
           from YourTable 
           group by x ) PreQuery
      join
         YourTable YT
            on PreQuery.X = YT.X 
            AND PreQuery.HighPerX = YT.y
    ,        这是经典的: 保持某一列的按组最大值的行     ,        另请参阅使用row_number()函数可以做什么 http://beyondrelational.com/blogs/madhivanan/archive/2007/08/27/multipurpose-row-number-function.aspx