如果我做一个
dense_rank() over (order by colname),
对于列 colname 中具有相同值的所有行,我得到相同的排名。
但是,我想将具有相同等级的行数限制为@maxrows,以便当@maxrows 行在colname 中具有相同的值时,即使colname 的值仍然相同,也会为下一行分配一个新的等级。
我怎样才能做到这一点?
如果我做一个
dense_rank() over (order by colname),
对于列 colname 中具有相同值的所有行,我得到相同的排名。
但是,我想将具有相同等级的行数限制为@maxrows,以便当@maxrows 行在colname 中具有相同的值时,即使colname 的值仍然相同,也会为下一行分配一个新的等级。
我怎样才能做到这一点?
您可以通过使用几个排名函数来实现这一点。我们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