Sto scrivendo una query SQL utilizzando PostgreSQL che ha bisogno di classificare le persone che "arrivano" in una certa posizione. Non tutti però arrivano. Sto usando una funzione finestra rank()
per generare ranghi di arrivo, ma nei luoghi in cui l'ora di arrivo è nullo, piuttosto che restituire un rango nullo, la funzione di aggregazione rank()
li tratta come se fossero arrivati dopo tutti gli altri. Quello che voglio succedere è che questi no-show ottengono un punteggio di NULL
invece di questo rango imputato.Ignorando valori nulli in in un rango postgresql() funzione di finestra
Ecco un esempio. Supponiamo che io sono un tavolo dinner_show_up
che assomiglia a questo:
| Person | arrival_time | Restaurant |
+--------+--------------+------------+
| Dave | 7 | in_and_out |
| Mike | 2 | in_and_out |
| Bob | NULL | in_and_out |
Bob non si presenta. La query che sto scrivendo sarebbe:
select Person,
rank() over (partition by Restaurant order by arrival_time asc)
as arrival_rank
from dinner_show_up;
E il risultato sarà
| Person | arrival_rank |
+--------+--------------+
| Dave | 2 |
| Mike | 1 |
| Bob | 3 |
Quello che voglio che accada invece è questo:
| Person | arrival_rank |
+--------+--------------+
| Dave | 2 |
| Mike | 1 |
| Bob | NULL |
Perfetto - grazie! –
+1 È interessante notare che, in SQL Server verrà rango elaborare i valori nulli prima non nulli e rango avranno gap, si presenta come Postgres elaborazione nulli dopo non null o non li contano a tutti? –
@RomanPekar È possibile definire se si desidera o meno NULL prima o l'ultima in ORDER BY della RANK() funzione (o query regolari ovviamente) -> http://www.postgresql.org/docs/current/static/ indexes-ordering.html – bma