Database
 sql >> Base de données >  >> RDS >> Database

Quelle est la différence entre RANK et DENSE_RANK en SQL ?

Problème :

Vous souhaitez comparer les classements produits par RANK et DENSE_RANK et ajoutez-les en tant que nouvelles colonnes à une table.

Exemple :

Notre base de données a une table nommée sales_assistant avec des données dans les colonnes suivantes :id (clé primaire), first_name , last_name , month , et sold products .

identifiant prénom nom_de_famille mois produits vendus
1 Lisa Noir 5 2 300
2 Marie Jacobs 5 2400
3 Lisa Noir 6 2 700
4 Marie Jacobs 6 2 700
5 Alex Smith 6 2900
6 Marie Jacobs 7 1200
7 Lisa Noir 7 1200
8 Alex Smith 7 1000

Affichons le nom et prénom de chaque vendeur et le nombre de produits vendus. Nous souhaitons également les classer en fonction du nombre de produits vendus par ordre décroissant.

Solution 1 :

SELECT RANK() OVER(ORDER BY produits vendus DESC) AS r, DENSE_RANK() OVER(ORDER BY produits vendus DESC) AS dr, first_name, last_name, month, sold productsFROM sales_assistant ;

Cette requête renvoie deux classements :un produit par RANK et un autre par DENSE_RANK . Quelle est la différence ?

En termes simples, RANK saute le nombre de positions après les enregistrements avec le même numéro de rang. Le classement RANK_DENSE renvoie les numéros de position de 1 à 6 car il ne saute pas les enregistrements avec le même numéro de rang :

r dr prénom nom_de_famille mois produits vendus
1 1 Alex Smith 6 2900
2 2 Lisa Noir 6 2 700
2 2 Marie Jacobs 6 2 700
4 3 Marie Jacobs 5 2400
5 4 Lisa Noir 5 2 300
6 5 Marie Jacobs 7 1200
6 5 Lisa Noir 7 1200
8 6 Alex Smith 7 1000

Discussion :

Si vous souhaitez classer les lignes dans le jeu de résultats, SQL propose le RANK() et DENSE_RANK les fonctions. Ces fonctions sont utilisées dans SELECT avec d'autres colonnes. Après RANK ou DENSE_RANK , nous appelons le OVER() fonction, qui prend un ORDER BY clause avec le nom de la colonne à trier avant d'attribuer un classement.

Contrairement à DENSE_RANK , RANK saute des positions après un classement égal. Le nombre de positions ignorées dépend du nombre de lignes ayant un classement identique. Par exemple, Mary et Lisa ont vendu le même nombre de produits et sont toutes deux classées n°2. Avec RANK , la position suivante est #4 ; avec DENSE_RANK , la position suivante est #3.

Les deux RANK et RANK_DENSE travailler sur des partitions de données :

Solution 1 :

SELECT RANK() OVER(PARTITION BY mois ORDER BY produits vendus DESC) AS r, DENSE_RANK() OVER(PARTITION BY mois ORDER BY produits vendus DESC) AS dr, first_name, last_name, month, sold productsFROM sales_assistant ; 

Vous pouvez diviser les enregistrements en groupes selon une colonne donnée (dans notre exemple, month ). Dans cette situation, les enregistrements sont classés comme faisant partie d'une partition :

r dr prénom nom_de_famille mois produits vendus
1 1 Marie Jacobs 5 2400
2 2 Lisa Noir 5 2 300
1 1 Alex Smith 6 2900
2 2 Lisa Noir 6 2 700
2 2 Marie Jacobs 6 2 700
1 1 Marie Jacobs 7 1200
1 1 Lisa Noir 7 1200
3 2 Alex Smith 7 1000