Il peut arriver que nous désirons avoir $n$ lignes du top par sous-groupe. Par exemple, pour une course donnée on veut les coureurs qui ont les 3 meilleurs temps pour chaque catégorie (junior, senior, etc.). Ce genre de requête ne peut pas être faite avec un GROUP BY
car ce dernier ne retourne qu’une seule ligne par groupe.
1. Union
Supposons que nous aimerions obtenir, pour chaque département, les données à propos des deux employés qui ont les salaires les plus élevés.
(SELECT * FROM Employee WHERE Department_id = 1 ORDER BY Salary DESC LIMIT 0,2)
UNION
(SELECT * FROM Employee WHERE Department_id = 2 ORDER BY Salary DESC LIMIT 0,2)
UNION
(SELECT * FROM Employee WHERE Department_id = 3 ORDER BY Salary DESC LIMIT 0,2)
UNION
(SELECT * FROM Employee WHERE Department_id = 4 ORDER BY Salary DESC LIMIT 0,2)
On obtient le tableau suivant.
{{h}} |
---|
{{r}} |
L’union est une opération de la théorie des ensembles qui permet de réunir les éléments de différents ensembles. La clause UNION
implémente cette opération.
Récap
GROUP BY
permet de grouper ensemble des lignes ayant une valeur d’attribut commune mais ne retourne qu’une seule ligne par sous-groupe.
UNION
réunit les éléments appartenant à des ensembles différents.
UNION
, combinée à ORDER BY
et LIMIT
, peut être utilisée pour obtenir les $n$ lignes du top par sous-groupe (dans l’exemple, $n=2$). Toutefois, cette approche présente deux inconvénients.
- On doit énumérer à la main les catégories désirées (i.e. les départements dans notre exemple).
- Elle ne tient pas compte le cas où plusieurs valeurs identiques existent (e.g. si trois employés avaient le même plus grand salaire dans un département donné dans notre exemple).
Le chapitre suivant décrit une technique qui corrige les défauts de la présente approche.