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 |