Problème :
Dans le jeu de résultats, vous souhaitez partitionner les enregistrements et classer les lignes dans chaque partition, en ajoutant une autre colonne pour afficher les rangs des lignes dans la partition.
Exemple :
Notre base de données a une table nommée magazine avec des données dans les colonnes suivantes :id
(clé primaire), name
, category
, et price
.
identifiant | nom | catégorie | prix |
---|---|---|---|
105 | Vivre à la campagne | style de vie | 1.70 |
108 | Magazine d'actualités | actualités | 3.35 |
115 | Décibel | musique | 6,50 |
123 | Magasin de batterie | musique | 6,50 |
145 | Coucher de soleil | style de vie | 12.00 |
155 | Monde | style de vie | 9.50 |
158 | Clavier | musique | 8.45 |
Regroupons les magazines par catégorie et classez chaque groupe par ordre décroissant de prix . Affichez la position de classement, le nom, la catégorie et le prix de chaque magazine.
Solution :
SELECT category, name, price, RANK() OVER (PARTITION BY category ORDER BY price DESC ) AS price_rank FROM magazine;
Voici le résultat :
catégorie | nom | prix | classement_prix |
---|---|---|---|
style de vie | Coucher de soleil | 12.00 | 1 |
style de vie | Monde | 9.50 | 2 |
style de vie | Vivre à la campagne | 1.70 | 3 |
musique | Clavier | 8.45 | 1 |
musique | Décibel | 6,50 | 2 |
musique | Magasin de batterie | 6,50 | 2 |
actualités | Magazine d'actualités | 3.35 | 1 |
Discussion :
Pour partitionner les lignes et les classer selon leur position dans la partition, utilisez la fonction RANK() avec la clause PARTITION BY.
La fonction RANK() de SQL nous permet d'ajouter la position d'un enregistrement dans le jeu de résultats ou dans chaque partition. Dans notre exemple, nous classons les lignes dans une partition.
La clause OVER() vient toujours après RANK(). OVER() doit contenir une clause ORDER BY. Si vous renvoyez des rangs dans une partition, placez une clause PARTITION BY dans la clause OVER(). PARTITION BY est suivi d'une expression ou d'un nom de colonne; dans notre exemple, nous utilisons la colonne category
(PARTITION BY category
).
Remarque : Si vous n'utilisez pas de partitions, vous pouvez omettre PARTITION BY et simplement mettre la clause ORDER BY dans OVER().
Après PARTITION BY, placez ORDER BY suivi des noms des colonnes ou expressions de tri. Dans notre exemple, nous trions par ordre décroissant selon la colonne price
(ORDER BY price DESC
). Le mot clé DESC indique un ordre de tri décroissant.
Dans l'exemple ci-dessus, l'utilisation de RANK() avec PARTITION BY a divisé l'ensemble de résultats en groupes distincts de magazines par leur catégorie . Avec chaque groupe, les lignes ont été triées par prix puis classé au sein de ce groupe.