2010-09-09 5 views
8

En un SQL Server DB, tengo una tabla de valores que me interesa clasificar.Estableciendo el rango en NULL utilizando RANK() OVER en SQL

Al realizar una RANK() OVER (ORDER BY VALOR DESC) como RANK, consigo los siguientes resultados (en una tabla hipotética):

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 

El problema es, no quiero las filas que tienen NULL para un VALOR para obtener un rango - Necesito una forma de establecer el rango para NULL. Hasta el momento, buscar en la web no me ha dado ninguna respuesta sobre cómo podría hacer esto.

Gracias por cualquier ayuda que pueda proporcionar.

Respuesta

8

Usted puede tratar de una instrucción 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

Esto hizo exactamente lo que necesitaba, ¡gracias! –

2

La sentencia CASE proporcionada anteriormente contaría los registros NULL en la fila si el ORDENAR POR ascendía en lugar de descender. Esto comenzaría la clasificación en 5 en lugar de 1, probablemente no lo que se desea.

Para garantizar que los nulos no se les contados en el rango, puede forzar a la parte inferior mediante la adición de un criterio de clasificación inicial de si el valor es nulo o no, así:

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 

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