admin

T-SQL“ ense_rank”,每个级别具有最大行数

sql

如果我做一个

dense_rank() over (order by colname),

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

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

我怎样才能做到这一点?


阅读 270

收藏
2021-06-07

共1个答案

admin

您可以通过使用几个排名功能来实现。我们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和第一个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
2021-06-07