PaliSkill
SQL — Fonctions de fenêtrage

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

Le piège du top-N avec ROW_NUMBER en présence d'ex-aequo

Utiliser ROW_NUMBER() pour isoler « le plus ancien de chaque équipe » choisit arbitrairement un seul gagnant en cas d'égalité — masquant qu'il pourrait y en avoir plusieurs à égalité.

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

Dans l'équipe support, David et Farid sont tous deux les plus anciens (7 ans chacun). Cette requête, avec ROW_NUMBER(), ne renvoie pourtant que David — Farid, à égalité, est silencieusement exclu à cause du départage par id. Résultat : 2 lignes (Amara, David).

SELECT nom, equipe FROM (
  SELECT nom, equipe,
    RANK() OVER (PARTITION BY equipe ORDER BY anciennete DESC) AS rk
  FROM employes
) t WHERE rk = 1;

Avec RANK() à la place, David et Farid reçoivent tous deux le rang 1 : les deux apparaissent. Résultat : 3 lignes (Amara, David, Farid).

À retenir :

  • ROW_NUMBER() pour un top-N choisit toujours exactement N lignes, quitte à départager arbitrairement des ex-aequo réels.
  • RANK() pour un top-N peut renvoyer plus de N lignes si des ex-aequo existent au niveau du seuil — mais n'exclut jamais injustement un ex-aequo.
  • Ce choix doit être délibéré : masquer un ex-aequo (ROW_NUMBER) ou l'assumer au prix d'un résultat plus grand que prévu (RANK) sont deux décisions différentes, pas une erreur en soi.

À vous de jouer : Farid apparaît-il dans le résultat de la version ROW_NUMBER de cette leçon ? Et dans la version RANK ?

🔒

Continuez ce module

Débloquez les leçons restantes ainsi que la certification finale.

2 500 XOF / 3,81 € / 4,15 $

Débloquez les 72 leçons restantes de ce module

Votre paiement est vérifié avant l'activation de l'accès