Principes fondamentaux
La clause GROUP BY regroupe les lignes, mais ne garantit pas un ordre spécifique à l'intérieur des groupes. Pour obtenir un tri intra-groupe, il est nécessaire d'employer des mécanismes supplémentaires comme les fonctions de fenêtrage ou des sous-requêtes corrélées.
Fonctions de fenêtrage (MySQL 8.0 et ultérieur)
Les fonctions de fenêtrage permettent des calculs sur des plages de lignes sans réduire le jeu de résultats. Des fonctions telles que ROW_NUMBER(), RANK() ou DENSE_RANK() sont adaptées pour attribuer des classements par groupe.
Exemple : Attribution d'un rang aux employés par service, basé sur le salaire
SELECT
identifiant,
nom_complet,
service,
remuneration,
DENSE_RANK() OVER (PARTITION BY service ORDER BY remuneration DESC) AS rang
FROM
liste_employes;
Cette requête utilise DENSE_RANK() pour partitionner les données par service et les trier par rémunération décroissante dans chaque partition.
Sous-requêtes pour les versions anciennes
Sur les versions de MySQL antérieures à la 8.0, une approche par sous-requêtes corrélées peut simuler un tri par groupe, bien que moins optimale.
Exemple : Classement des employés par service via sous-requête
SELECT
e.id_emp,
e.nom_emp,
e.dept,
e.remuneration,
(SELECT COUNT(*) FROM employes e2 WHERE e2.dept = e.dept AND e2.remuneration > e.remuneration) + 1 AS position
FROM
employes e
ORDER BY
e.dept, e.remuneration DESC;
Ici, la sous-requête dénombre les collègues ayant un salaire supérieur dans le même service pour calculer le rang, et la requête principale organise l'affichage final.
FAQ
Q1 : Comment effectuer un tri à l'intérieur des groupes dans MySQL ?
R1 : Pour les versions récentes, préférez les fonctions de fenêtrage (ROW_NUMBER, RANK, etc.) avec la clause OVER. Pour les versions anciennes, recourez à des sous-requêtes corrélées pour calculer les classements.
Q2 : Quels sont les avantages des fonctions de fenêtrage par rapport aux sous-requêtes pour le tri par groupe ?
R2 : Les fonctions de fenêtrage offrent une syntaxe plus concise, de meilleures performances sur les gros volumes de données et évitent la complexité des sous-requêtes imbriquées. Elles traitent le regroupement et le tri dans une seule passe.