考虑以下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
我需要选择最大值为Y的行的ID,即x,即:
ID | X | Y
------+-------+-------
3 | 1 | 3
5 | 2 | 500
7 | 3 | 100
查询将嵌套多次,因此需要最佳性能解决方案......
答案 0 :(得分: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)
查询:
;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 +中使用。
答案 1 :(得分:2)
是的,很多时候这类问题......添加了关键字“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
答案 2 :(得分:1)
答案 3 :(得分:1)
另请参阅使用row_number()函数可以执行的操作 http://beyondrelational.com/blogs/madhivanan/archive/2007/08/27/multipurpose-row-number-function.aspx