J'écris une requête SQL utilisant PostgreSQL qui doit classer les personnes qui "arrivent" à un endroit donné. Cependant, tout le monde n'arrive pas. J'utilise un rank()
pour générer des rangs d'arrivée, mais dans les cas où l'heure d'arrivée est nulle, au lieu de renvoyer un rang nul, la fonction rank()
La fonction d'agrégation les traite simplement comme s'ils étaient arrivés après tous les autres. Ce que je veux, c'est que ces personnes qui ne se présentent pas aient un rang de NULL
au lieu de ce rang imputé.
Voici un exemple. Supposons que j'ai un tableau dinner_show_up
qui ressemble à ça :
| Person | arrival_time | Restaurant |
+--------+--------------+------------+
| Dave | 7 | in_and_out |
| Mike | 2 | in_and_out |
| Bob | NULL | in_and_out |
Bob ne se montre jamais. La requête que j'écris serait :
select Person,
rank() over (partition by Restaurant order by arrival_time asc)
as arrival_rank
from dinner_show_up;
Et le résultat sera
| Person | arrival_rank |
+--------+--------------+
| Dave | 2 |
| Mike | 1 |
| Bob | 3 |
Ce que je veux qu'il se passe à la place, c'est ça :
| Person | arrival_rank |
+--------+--------------+
| Dave | 2 |
| Mike | 1 |
| Bob | NULL |