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