在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。到目前为止,搜索网络并没有给我提供如何能够做到这一点的答案。
感谢您提供的任何帮助。
答案 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