2

如果我做一个

dense_rank() over (order by colname),

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

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

我怎样才能做到这一点?

4

1 回答 1

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
于 2013-12-18T11:46:29.577 回答