如果我做了
dense_rank() over (order by colname),
我对列colname中具有相同值的所有行获得相同的排名。
但是,我想将具有相同等级的行数限制为@maxrows,以便当@maxrows行在colname中具有相同的值时,即使colname的值仍然是,仍会为下一行分配新的等级同样的。
我怎样才能做到这一点?
答案 0 :(得分:3)
您可以通过使用多个排名功能来实现此目的。我们在中间和另一列使用ROW_NUMBER()
来执行打破平局:
declare @maxRows int
set @maxRows = 5
; With InitialRanks as (
select DENSE_RANK() OVER (ORDER BY type) as rnk,* from sys.objects
), OrderedRanks as (
select (ROW_NUMBER() OVER (PARTITION BY rnk ORDER by object_id)-1)
/ @maxRows as rn,*
from InitialRanks
)
select DENSE_RANK() OVER (ORDER BY rnk,rn),* from OrderedRanks
在这里,每个(最终)排名值最多只能有5列。排名基于type
,但我们使用object_id
作为辅助列来计算允许行具有特定排名的顺序。
原来我已经过度复杂了上述内容 - 不需要第一个CTE和第一个DENSE_RANK
,因为它实际上充当type
ROW_NUMBER()
列的代理函数 - 所以为什么不直接使用type
列并简化:
declare @maxRows int
set @maxRows = 5
; With OrderedRanks as (
select (ROW_NUMBER() OVER (PARTITION BY type ORDER by object_id)-1)
/ @maxRows as rn,*
from sys.objects
)
select DENSE_RANK() OVER (ORDER BY type,rn),* from OrderedRanks