问题描述
||
考虑以下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