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

Tom*_*der 8 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
Run Code Online (Sandbox Code Playgroud)

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

感谢您的任何帮助,您可以提供.

Mar*_*ers 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
Run Code Online (Sandbox Code Playgroud)


小智 6

如果 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
Run Code Online (Sandbox Code Playgroud)

*** 归功于 Hugo Kornelis:https ://social.msdn.microsoft.com/Forums/sqlserver/en-US/deb8a0aa-aaab-442b-a667-11220333a4e0/rank-without-counting-null-values ? forum =事务处理