Leçon 1 / 9 — Chapitre 6: Combiner fenêtres, CASE et sous-requêtes
Cas pratique : fonction de fenêtrage + PARTITION BY combinés
SELECT nom, equipe, anciennete, rang
FROM (
SELECT nom, equipe, anciennete,
RANK() OVER (PARTITION BY equipe ORDER BY anciennete DESC) AS rang
FROM employes
) AS classement
WHERE rang <= 2;
Étape par étape :
RANK() OVER (PARTITION BY equipe ORDER BY anciennete DESC)classe chaque équipe séparément : ventes → Amara(1), Baptiste(2), Chloé(2, ex-aequo) ; support → David(1), Farid(1, ex-aequo), Elise(3, car RANK saute le rang 2 après l'égalité).WHERE rang <= 2garde les 2 premiers rangs de chaque équipe — mais un ex-aequo peut faire dépasser ce nombre de lignes gardées : ventes garde ses 3 membres (1, 2, 2 sont tous ≤ 2), support n'en garde que 2 (Elise, au rang 3, est exclue).
Résultat final : 5 lignes (3 pour ventes, 2 pour support).
À retenir :
- Combiner PARTITION BY et un filtre sur le rang (via sous-requête) isole un « top N » par groupe — mais un ex-aequo peut faire apparaître plus de N lignes dans un groupe (comme ventes ici, qui garde 3 lignes malgré rang <= 2).
- DENSE_RANK() à la place de RANK() changerait ce comportement, puisqu'il ne saute jamais de rang.
À vous de jouer : remplacez RANK() par DENSE_RANK() dans cette requête, et recalculez combien de lignes le résultat contient pour l'équipe support.
À vous de jouer
À faireVoici une table employes :
employes
id | nom | equipe | anciennete
1 | Amara | ventes | 5
2 | Baptiste | ventes | 3
3 | Chloé | ventes | 3
4 | David | support | 7
5 | Elise | support | 2
6 | Farid | support | 7
Combien de lignes contient le résultat final de :
SELECT nom, equipe, anciennete, rang
FROM (
SELECT nom, equipe, anciennete,
RANK() OVER (PARTITION BY equipe ORDER BY anciennete DESC) AS rang
FROM employes
) AS classement
WHERE rang <= 2;
Testez cette requête dans un bac à sable SQL en ligne (SQLite Fiddle, W3Schools "Try SQL", ou tout autre) pour vérifier le résultat avant de répondre.
💡 Un nombre.
À vous de jouer
À faireDans le résultat de la même requête, Elise apparaît-elle dans ce résultat ? Répondez par oui ou non.
Testez cette requête dans un bac à sable SQL en ligne (SQLite Fiddle, W3Schools "Try SQL", ou tout autre) pour vérifier le résultat avant de répondre.
💡 Oui ou non.