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 |