T-SQL“dense_rank”,每个等级的最大行数

时间:2013-12-18 11:26:05

标签: sql sql-server tsql dense-rank

如果我做了

dense_rank() over (order by colname),

我对列colname中具有相同值的所有行获得相同的排名。

但是,我想将具有相同等级的行数限制为@maxrows,以便当@maxrows行在colname中具有相同的值时,即使colname的值仍然是,仍会为下一行分配新的等级同样的。

我怎样才能做到这一点?

1 个答案:

答案 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