在 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。到目前为止,在网络上搜索还没有给我带来关于如何做到这一点的答案。
感谢您提供的任何帮助。
您可以尝试使用 CASE 语句:
SELECT
CASE WHEN Value IS NULL THEN NULL
ELSE RANK() OVER (ORDER BY VALUE DESC)
END AS RANK,
USER_ID,
VALUE
FROM yourtable
如果 SORT BY 是升序而不是降序,前面提供的 CASE 语句将计算排名中的 NULL 记录。这将从 5 而不是 1 开始排名 - 可能不是我们想要的。
为了确保空值不被计入排名,您可以通过添加关于值是否为 NULL 的初始排序标准来强制它们到底部,如下所示:
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?论坛=transactsql
更简单的解决方案是使用 WHERE 从 VALUE 中过滤掉所有 NULL:
SELECT USER_ID, VALUE, RANK() OVER(ORDER BY VALUE DESC) FROM yourtable
WHERE VALUE IS NOT NULL