Funzioni analitiche Oracle per stilare delle classifiche (ranking)

Posted by Alessia, Roberta, Saverio ed Antonella | Posted in , | 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
In pratica i due parametri strani sono quasi sempre 1 e 0.

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.


Comments Posted (0)

Posta un commento