PaliSkill
SQL — Fonctions de fenêtrage

Leçon 1 / 9 — Chapitre 2: Isoler le top N par groupe

Cas d'usage concret : le membre le plus ancien de chaque équipe

Impossible d'écrire directement WHERE ROW_NUMBER() OVER (...) = 1 : dans l'ordre logique d'exécution d'une requête SQL, WHERE s'applique avant que les fonctions de fenêtrage soient calculées. Il faut donc passer par une sous-requête (ou une CTE) : calculer d'abord le rang, puis filtrer sur ce résultat.

SELECT nom, equipe, anciennete
FROM (
  SELECT nom, equipe, anciennete,
    ROW_NUMBER() OVER (PARTITION BY equipe ORDER BY anciennete DESC, id ASC) AS rang_equipe
  FROM employes
) AS classement
WHERE rang_equipe = 1;

Cette requête isole le membre le plus ancien de chaque équipe : Amara pour ventes, David pour support.

À retenir :

  • On ne peut pas filtrer directement sur le résultat d'une fonction de fenêtre dans un WHERE — il faut d'abord la calculer dans une sous-requête, puis filtrer sur ce résultat dans la requête englobante.
  • Ce schéma (« calculer un rang par groupe, puis garder rang = 1 ») est le moyen standard d'isoler « le premier de chaque groupe » (le plus ancien, le plus vendu, le plus récent...).

À vous de jouer : modifiez rang_equipe = 1 en rang_equipe = 2 pour obtenir le deuxième plus ancien de chaque équipe.

À 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 retourne :

SELECT nom, equipe, anciennete
FROM (
  SELECT nom, equipe, anciennete,
    ROW_NUMBER() OVER (PARTITION BY equipe ORDER BY anciennete DESC, id ASC) AS rang_equipe
  FROM employes
) AS classement
WHERE rang_equipe = 1;

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, quel est le nom du membre le plus ancien de l'équipe 'support' ?

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 prénom.

Quitter le module