2011-03-01 67 views
0

我有一个SQL查询有3 int列,然后3 Rank()函数与排列这3列的partition by每列SQL Server秩()上限

问题是,我只想为每列排列高达5000,然后停止。无论如何在单个查询中做到这一点,而不会将它分成3个查询?我还是希望所有的第3列中的数据,只是想Rank()列走空后5000

每个分区将上升到5000

感谢

回答

3

你可以使用一个case语句。

... 
CASE WHEN ROW_NUMBER() OVER (<partition by>) <= 5000 
    THEN <rank function> 
    ELSE NULL 
END 
... 
+0

这个技巧。谢谢。不幸的是,性能增益很小,但我注意到性能略有增加。 – bladefist 2011-03-01 18:24:53

1

扩大对乔·斯特凡内利的解决方案:

;with cte as (
    select a, b, c, 
     rank() over (partition by ...) as [r1], 
     rank() over (partition by ...) as [r2], 
     rank() over (partition by ...) as [r3] 
    from your_table 
) 
select a, b, c, 
    case when [r1] <= 5000 then [r1] else null end as [r1] 
    case when [r2] <= 5000 then [r1] else null end as [r2] 
    case when [r3] <= 5000 then [r1] else null end as [r3] 
from cte 
0

的RANK()函数把相似的价值观相似的行列,因此NULL值获得相同的等级。所以解决方法是使用ROW_NUMBER()。