的最大数目。如果我做了T-SQL“DENSE_RANK”有行的,每个等级
dense_rank() over (order by colname),
我得到了与列colname的相同值的所有行排名相同。
但是,我想限制具有相同等级的行数为@maxrows,以便@maxrows行在colname中具有相同的值时,即使colname的值为还是一样。
我该如何做到这一点?
的最大数目。如果我做了T-SQL“DENSE_RANK”有行的,每个等级
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
真实有效地充当在ROW_NUMBER()
功能type
列的代理 - 那么,为什么不直接使用在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
非常有创意的排名功能使用! – usr
感谢这个非常聪明的解决方案! –
可以使用NTILE函数作为NTILE功能允许通过分配瓦数每行你在结果瓷砖(的 行同样大小的群体)的行关联。您指定输入 之后的图块数量,并在OVER子句中指定逻辑排序。 – Deepshikha
'NTILE'几乎与OP所要求的相反 - 你指定了你想要的组数,而不是组的大小。另外,'NTILE'会将具有*不同*'colname'值的行放在同一个组中,它们完全不像'DENSE_RANK()'。 –