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.

Database schema

Figure 4.1 : schéma de base de données

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.

  1. On doit énumérer à la main les catégories désirées (i.e. les départements dans notre exemple).
  2. 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.