2013-12-18 32 views
2

的最大数目。如果我做了T-SQL“DENSE_RANK”有行的,每个等级

dense_rank() over (order by colname), 

我得到了与列colname的相同值的所有行排名相同。

但是,我想限制具有相同等级的行数为@maxrows,以便@maxrows行在colname中具有相同的值时,即使colname的值为还是一样。

我该如何做到这一点?

+0

可以使用NTILE函数作为NTILE功能允许通过分配瓦数每行你在结果瓷砖(的 行同样大小的群体)的行关联。您指定输入 之后的图块数量,并在OVER子句中指定逻辑排序。 – Deepshikha

+0

'NTILE'几乎与OP所要求的相反 - 你指定了你想要的组数,而不是组的大小。另外,'NTILE'会将具有*不同*'colname'值的行放在同一个组中,它们完全不像'DENSE_RANK()'。 –

回答

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真实有效地充当在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 
+0

非常有创意的排名功能使用! – usr

+0

感谢这个非常聪明的解决方案! –