PaliSkill
SQL — Fonctions de fenêtrage

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 :

  1. 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é).
  2. WHERE rang <= 2 garde 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

À faire

Voici 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

À faire

Dans 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.

Quitter le module