2010-09-09 34 views
8

Trong SQL Server DB, tôi có một bảng các giá trị mà tôi quan tâm đến xếp hạng.Đặt thứ hạng thành NULL bằng cách sử dụng hàm RANK() OVER trong SQL

Khi tôi thực hiện một RANK() OVER (ORDER BY GIÁ TRỊ DESC) như RANK, tôi nhận được kết quả như sau (trong một bảng tính giả thuyết):

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 

Vấn đề là, tôi không muốn các hàng trong đó có NULL cho một GIÁ TRỊ để có được một thứ hạng - Tôi cần một số cách để thiết lập thứ hạng cho các NULL. Cho đến nay, tìm kiếm trên web đã mang lại cho tôi không có câu trả lời nào về cách tôi có thể thực hiện việc này.

Cảm ơn bạn đã trợ giúp bạn có thể cung cấp.

Trả lời

8

Bạn có thể thử một tuyên bố 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

Điều này đã làm chính xác những gì tôi cần, cảm ơn! –

2

Các lệnh CASE cung cấp trước đó sẽ đếm các hồ sơ NULL trong cấp bậc nếu Sắp xếp được tăng dần chứ không phải là giảm dần. Điều này sẽ bắt đầu xếp hạng ở mức 5 chứ không phải 1 - có thể không phải là điều mong muốn.

Để đảm bảo rằng các null không được tính vào cấp bậc, bạn có thể buộc họ phải phía dưới bằng cách thêm một tiêu chí phân loại ban đầu vào việc giá trị IS NULL hay không, như vậy:

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 

* ** tín dụng cho Hugo Kornelis: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/deb8a0aa-aaab-442b-a667-11220333a4e0/rank-without-counting-null-values?forum=transactsql

Các vấn đề liên quan