Database
 sql >> Database >  >> RDS >> Database

Qual è la differenza tra RANK e DENSE_RANK in SQL?

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 .

mese
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:

mese
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:

mese
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