2010-09-09 71 views
8

在SQL Server數據庫級別設置爲NULL,我有我感興趣的排名值的表。使用RANK()OVER在SQL

當我執行OVER(ORDER BY VALUE DESC)爲RANK,我得到的結果如下(在假設表)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。到目前爲止,搜索網絡給我如何能夠做到這一點沒有答案。

感謝您的幫助,您可以提供。

回答

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 
+0

這正是做了我需要的,謝謝! – 2010-09-09 13:34:18

2

早些時候提供的CASE語句將在列數的空記錄,如果排序依據是上升,而不是下降。這將開始排名在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 

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