我有一个SQL查询有3 int
列,然后3 Rank()
函数与排列这3列的partition by
。每列SQL Server秩()上限
问题是,我只想为每列排列高达5000,然后停止。无论如何在单个查询中做到这一点,而不会将它分成3个查询?我还是希望所有的第3列中的数据,只是想Rank()
列走空后5000
每个分区将上升到5000
感谢
我有一个SQL查询有3 int
列,然后3 Rank()
函数与排列这3列的partition by
。每列SQL Server秩()上限
问题是,我只想为每列排列高达5000,然后停止。无论如何在单个查询中做到这一点,而不会将它分成3个查询?我还是希望所有的第3列中的数据,只是想Rank()
列走空后5000
每个分区将上升到5000
感谢
你可以使用一个case语句。
...
CASE WHEN ROW_NUMBER() OVER (<partition by>) <= 5000
THEN <rank function>
ELSE NULL
END
...
扩大对乔·斯特凡内利的解决方案:
;with cte as (
select a, b, c,
rank() over (partition by ...) as [r1],
rank() over (partition by ...) as [r2],
rank() over (partition by ...) as [r3]
from your_table
)
select a, b, c,
case when [r1] <= 5000 then [r1] else null end as [r1]
case when [r2] <= 5000 then [r1] else null end as [r2]
case when [r3] <= 5000 then [r1] else null end as [r3]
from cte
的RANK()函数把相似的价值观相似的行列,因此NULL值获得相同的等级。所以解决方法是使用ROW_NUMBER()。
这个技巧。谢谢。不幸的是,性能增益很小,但我注意到性能略有增加。 – bladefist 2011-03-01 18:24:53