在SQL中使用RANK()OVER将等级设置为NULL

时间:2010-09-09 13:18:50

标签: sql null rank

在SQL Server数据库中,我有一个我对排名感兴趣的值表。

当我执行RANK()OVER(ORDER BY VALUE DESC)作为RANK时,我得到以下结果(在假设的表格中):

RANK | USER_ID   | VALUE
------------------------
1   | 33        | 30000
2   | 10        | 20000
3   | 45        | 10000
4   | 12        | 5000
5   | 43        | 2000
6   | 32        | NULL
6   | 13        | NULL
6   | 19        | NULL
6   | 28        | NULL

问题是,我不希望VALUE为NULL的行获得排名 - 我需要某种方法将这些排名设置为NULL。到目前为止,搜索网络并没有给我提供如何能够做到这一点的答案。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:8)

您可以尝试CASE声明:

SELECT
    CASE WHEN Value IS NULL THEN NULL
         ELSE RANK() OVER (ORDER BY VALUE DESC)
    END AS RANK,
    USER_ID,
    VALUE
FROM yourtable

答案 1 :(得分:3)

如果SORT BY是升序而不是降序,前面提供的CASE语句将计算排名中的NULL记录。这将使排名在5而不是1 - 可能不是所期望的。

为确保空值不会在排名中计算,您可以通过添加关于值是否为空的初始排序条件来强制它们到底部,如下所示:

SELECT
    CASE WHEN Value IS NULL THEN NULL
         ELSE RANK() OVER 
               (ORDER BY CASE WHEN Value IS NULL THEN 1 ELSE 0 END, VALUE DESC) 
    END AS RANK,
    USER_ID,
    VALUE
FROM yourtable

***感谢Hugo Kornelis:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/deb8a0aa-aaab-442b-a667-11220333a4e0/rank-without-counting-null-values?forum=transactsql