2010-09-09 1 views
8

Dans une base de données SQL Server, j'ai une table de valeurs que je suis intéressé par le classement.Définition de la valeur NULL à l'aide de RANK() OVER dans SQL

Lorsque j'effectue une RANK() OVER (ORDER BY VALEUR DESC) comme RANG, je reçois les résultats suivants (dans un tableau hypothétique):

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 

Le problème est, je ne veux pas les lignes qui ont la valeur NULL pour une valeur pour obtenir un rang - j'ai besoin d'un moyen de définir le rang de ces valeurs à NULL. Jusqu'à présent, la recherche sur le Web ne m'a apporté aucune réponse sur la façon dont je pourrais être en mesure de le faire.

Merci pour toute aide que vous pouvez fournir.

Répondre

8

Vous pouvez essayer une instruction 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

Cela a fait exactement ce dont j'avais besoin, merci! –

2

L'instruction CASE fourni plus tôt compterait les enregistrements NULL dans le rang si la TRIER PAR gravissait plutôt que de descendre. Cela commencerait le classement à 5 plutôt que 1 - probablement pas ce qui est désiré.

Pour vous assurer que les valeurs nulles ne sont pas comptés dans le rang, vous pouvez les forcer à fond en ajoutant un critère de tri initial que la valeur IS NULL ou non, comme ceci:

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

Questions connexes