Problema:
Vuoi confrontare le classifiche prodotte da RANK
e DENSE_RANK
e aggiungile come nuove colonne a una tabella.
Esempio:
Il nostro database ha una tabella denominata sales_assistant
con i dati nelle seguenti colonne:id
(chiave primaria), first_name
, last_name
, month
e sold products
.
id | nome | cognome | prodotti venduti | |
---|---|---|---|---|
1 | Lisa | Nero | 5 | 2300 |
2 | Maria | Giacobbe | 5 | 2400 |
3 | Lisa | Nero | 6 | 2700 |
4 | Maria | Giacobbe | 6 | 2700 |
5 | Alex | Fabio | 6 | 2900 |
6 | Maria | Giacobbe | 7 | 1200 |
7 | Lisa | Nero | 7 | 1200 |
8 | Alex | Fabio | 7 | 1000 |
Mostriamo il nome e il cognome di ciascun assistente alle vendite e il numero di prodotti venduti. Vogliamo anche classificarli in base al numero di prodotti venduti in ordine decrescente.
Soluzione 1:
SELECT RANK() OVER(ORDER BY sold products DESC) AS r, DENSE_RANK() OVER(ORDER BY sold products DESC) AS dr, first_name, last_name, month, sold products FROM sales_assistant;
Questa query restituisce due classifiche:una prodotta da RANK
e un altro da DENSE_RANK
. Qual è la differenza?
In poche parole, RANK
salta il numero di posizioni dopo i record con lo stesso numero di rango. La classifica RANK_DENSE
restituisce i numeri di posizione da 1 a 6 perché non salta i record con lo stesso numero di rango:
r | dottore | nome | cognome | prodotti venduti | |
---|---|---|---|---|---|
1 | 1 | Alex | Fabio | 6 | 2900 |
2 | 2 | Lisa | Nero | 6 | 2700 |
2 | 2 | Maria | Giacobbe | 6 | 2700 |
4 | 3 | Maria | Giacobbe | 5 | 2400 |
5 | 4 | Lisa | Nero | 5 | 2300 |
6 | 5 | Maria | Giacobbe | 7 | 1200 |
6 | 5 | Lisa | Nero | 7 | 1200 |
8 | 6 | Alex | Fabio | 7 | 1000 |
Discussione:
Se desideri classificare le righe nel set di risultati, SQL offre il RANK()
e DENSE_RANK
funzioni. Queste funzioni sono utilizzate in SELECT
con altre colonne. Dopo RANK
o DENSE_RANK
, chiamiamo OVER()
funzione, che accetta un ORDER BY
clausola con il nome della colonna da ordinare prima di assegnare una graduatoria.
A differenza di DENSE_RANK
, RANK
salta le posizioni dopo la parità di ranking. Il numero di posizioni saltate dipende da quante righe avevano una classifica identica. Ad esempio, Mary e Lisa hanno venduto lo stesso numero di prodotti e sono entrambe classificate al secondo posto. Con RANK
, la posizione successiva è #4; con DENSE_RANK
, la posizione successiva è #3.
Entrambi RANK
e RANK_DENSE
lavorare su partizioni di dati:
Soluzione 1:
SELECT RANK() OVER(PARTITION BY month ORDER BY sold products DESC) AS r, DENSE_RANK() OVER(PARTITION BY month ORDER BY sold products DESC) AS dr, first_name, last_name, month, sold products FROM sales_assistant;
Puoi dividere i record in gruppi in base a una determinata colonna (nel nostro esempio, month
). In questa situazione, i record vengono classificati come parte di una partizione:
r | dottore | nome | cognome | prodotti venduti | |
---|---|---|---|---|---|
1 | 1 | Maria | Giacobbe | 5 | 2400 |
2 | 2 | Lisa | Nero | 5 | 2300 |
1 | 1 | Alex | Fabio | 6 | 2900 |
2 | 2 | Lisa | Nero | 6 | 2700 |
2 | 2 | Maria | Giacobbe | 6 | 2700 |
1 | 1 | Maria | Giacobbe | 7 | 1200 |
1 | 1 | Lisa | Nero | 7 | 1200 |
3 | 2 | Alex | Fabio | 7 | 1000 |