2010-09-09 7 views
8

In un DB di SQL Server, ho una tabella di valori che mi interessa classificare.Impostazione rango su NULL utilizzando RANK() OVER in SQL

Quando si esegue RANK() OVER (ORDER BY VALORE DESC) come RANK, ottengo i seguenti risultati (in una tabella ipotetica):

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 

Il problema è, non voglio le righe che hanno NULL per un VALORE per ottenere un rank - ho bisogno di un modo per impostare il rank per questi su NULL. Finora, la ricerca sul Web non mi ha dato alcuna risposta su come potrei essere in grado di farlo.

Grazie per l'aiuto che puoi fornire.

risposta

8

Si può provare una dichiarazione 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

Questo ha fatto esattamente quello che mi serviva, grazie! –

2

L'istruzione CASE fornito in precedenza sarebbero contare i record NULL nel rango se l'ORDINAMENTO stata ascendente piuttosto che discendente. Ciò avvierebbe la classifica su 5 anziché su 1 - probabilmente non è ciò che si desidera.

per garantire che i valori nulli non vengono conteggiati nel rango, è possibile forzare verso il basso con l'aggiunta di un criterio di ordinamento iniziale se il valore è nullo o no, in questo modo:

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 

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

Problemi correlati