2010-09-09 17 views
8

'DAKI OVER kullanarak RULL için sıralama değeri SQL Server DB'de, sıralamada ilgi duyduğum bir değerler tablom var.RANK() SQL

I (DEĞER DESC ORDER BY) RANK olarak, ben (varsayımsal tabloda) Aşağıdaki sonuçlar elde ÜZERİNDEN bir RANK() gerçekleştirdiğinizde: sorundur

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 

, ben satırları istemiyorum

bir sıralama elde etmek için NULL olan NULL var - Bunlara NULL için sıralama yapmanın bir yoluna ihtiyacım var. Şimdiye kadar, web’de arama yapmak bana bunu nasıl yapabileceğimi gösteren bir cevap getirmedi.

Sağladığınız her türlü yardım için teşekkür ederiz.

cevap

8

Bir CASE deyimi deneyebilirsiniz: SIRALAMA artan ziyade azalan eğer

SELECT 
    CASE WHEN Value IS NULL THEN NULL 
     ELSE RANK() OVER (ORDER BY VALUE DESC) 
    END AS RANK, 
    USER_ID, 
    VALUE 
FROM yourtable 
+0

Bu, tam olarak ne istediğimi yaptı, teşekkürler! –

2

önce verilen CASE deyimi sıralamasında BOŞ kayıtları sayar. Bu sıralama 1'den ziyade 5'de başlayacaktı - muhtemelen istenen değil.

şöyle, değer IS NULL olmadığı konusunda bir ilk sıralama kriterleri ekleyerek dibine onları zorlayabilir, nulls rütbe sayılan alamadım sağlamak ya da olmamak:

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'e: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/deb8a0aa-aaab-442b-a667-11220333a4e0/rank-without-counting-null-values?forum=transactsql