Funzioni analitiche Oracle per stilare delle classifiche (ranking)
Posted by Alessia, Roberta, Saverio ed Antonella | Posted in Funzioni Analitiche , Oracle in pillole | Posted on 13:25
Vi è mai capitato di dover individuare i migliori performer tra il personale di vendita di una azienda?
Come avete fatto?
Probabilmente con una istruzione del tipo:
select rownum, venditore, tot_ordinato from vendite order by tot_ordinato desc
Peccato che, se la classifica andasse suddivisa per regioni o per gruppi di prodotti, questa tecnica non potrebbe più funzionare...
Ecco l'istruzione SQL più efficiente:
SELECT venditore, regione, dense_rank() over (partition by regione order by tot_ordinato desc) as classifica
from vendite ORDER BY regione, classifica
Oltre a rank ci sono dense_rank e row_number; ci sono piccole differenze tra loro...
E se poi vi chiedessero di avere le differenze di ordinato tra un venditore ed il precedente (o il successivo, il primo o l'ultimo) in classifica?
Niente paura:
SELECT venditore, regione, dense_rank() over (partition by regione order by tot_ordinato desc) classifica
, LEAD(tot_ordinato, 1, 0) OVER (partition by regione order by tot_ordinato desc) valore_success_inferiore
, LAG(tot_ordinato, 1, 0) OVER (partition by regione order by tot_ordinato desc) valore_preced_superiore
from Vendite order by regione, classifica;
I parametri delle funzioni Lead e Lag sono:
- tot_ordinato: il campo della tabella o una espressione sql più complessa
- 1: l'offset dalla riga corrente
- 0: valore di default se il tot_ordinato è nullo
C'è molto di più di quanto spiegato; ma una volta compresi i meccanismi illustrati nei due post, tutto il resto (se vi serve) è semplice.
Comunque vi abbiamo descritto quello che è utile usare nella maggioranza dei casi.