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 l'attestation finale.

8 000 XOF / 12,20 € / 13,29 $

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

Pour vous communiquer où envoyer le paiement.

Moyen de paiement souhaité

Nous vous contactons pour le paiement — activé dès réception.