0Pricing
Coding Interview Prep · Leçon

Gérer les égalités parmi les N premiers

Savoir quand utiliser RANK ou DENSE_RANK pour inclure toutes les lignes à égalité

Gérer les égalités parmi les N premiers est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Coding Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Coding Interview Prep comprend 4 leçons au total.

La question complémentaire sur les égalités

Une fois que vous maîtrisez les N premiers avec ROW_NUMBER, le recruteur vous met à l'épreuve : « Que se passe-t-il si deux employés ont exactement le même salaire à la limite ? Faut-il les inclure tous les deux ? »

Cela distingue les candidats qui ont mémorisé une seule requête de ceux qui comprennent la sémantique du classement. La réponse dépend du choix entre ROW_NUMBER, RANK et DENSE_RANK. Cette leçon associe chaque fonction à l'intention métier correspondante.

ROW_NUMBER masque les égalités

ROW_NUMBER attribue à chaque ligne un entier strictement unique. Même lorsque deux lignes ont la même valeur dans la colonne de tri, l'une reçoit 2 et l'autre 3, dans un ordre arbitraire.

Conséquence : un filtre WHERE rn <= 3 renvoie exactement 3 lignes et peut écarter silencieusement une ligne ex æquo qui aurait pourtant mérité d'être incluse. C'est approprié lorsque vous voulez réellement un nombre fixe, mais incorrect lorsque toutes les égalités doivent être retenues.

-- Salaries: 100, 90, 90, 80
-- ROW_NUMBER -> 1, 2, 3, 4  (the two 90s get 2 and 3 arbitrarily)
ROW_NUMBER() OVER (ORDER BY salary DESC)

RANK laisse des trous

RANK attribue le même rang aux lignes ex æquo, puis saute les valeurs suivantes pour tenir compte des égalités. Deux lignes ex æquo au rang 2 reçoivent toutes les deux 2, et la ligne suivante passe au rang 4, et non 3.

Utilisez RANK lorsque vous voulez les « 3 premiers rangs » et qu'un rang peut être occupé par plusieurs personnes, comme dans un classement sportif réel où deux médaillés d'argent signifient qu'il n'y a pas de médaillé de bronze.

-- Salaries: 100, 90, 90, 80
-- RANK -> 1, 2, 2, 4   (rank 3 is skipped)
RANK() OVER (ORDER BY salary DESC)

DENSE_RANK ne laisse aucun trou

DENSE_RANK attribue également le même rang aux lignes ex æquo, mais ne saute pas de rang ensuite. Deux lignes ex æquo au rang 2 reçoivent toutes les deux 2, et la valeur distincte suivante reçoit 3.

Utilisez DENSE_RANK lorsque la question porte sur des valeurs distinctes : « les 3 niveaux de salaire distincts les plus élevés » ou « les 3 tranches de prix les plus élevées ». Cette fonction compte les valeurs uniques, et non les lignes.

-- Salaries: 100, 90, 90, 80
-- DENSE_RANK -> 1, 2, 2, 3   (no gap)
DENSE_RANK() OVER (ORDER BY salary DESC)

Comparaison côte à côte

Pour la liste de salaires 100, 90, 90, 80, les trois fonctions produisent :

  • ROW_NUMBER : 1, 2, 3, 4
  • RANK : 1, 2, 2, 4
  • DENSE_RANK : 1, 2, 2, 3

Ce tableau mérite d'être mémorisé parfaitement. Le recruteur peut simplement vous demander de le compléter pour une liste donnée, et la compréhension du comportement des trous est précisément l'objectif.

SELECT salary,
  ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn,
  RANK()       OVER (ORDER BY salary DESC) AS rnk,
  DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees;

Inclure toutes les lignes ex æquo avec RANK

Pour répondre à « les 3 premiers, mais inclure toutes les personnes ex æquo à la limite », filtrez avec RANK() <= 3. Si deux personnes partagent le rang 3, elles apparaissent toutes les deux ; le résultat peut donc contenir plus de 3 lignes.

C'est l'intention des questions formulées comme « les 3 premiers rangs », plutôt que « 3 lignes quelconques ». Précisez explicitement que le nombre de lignes peut dépasser N en cas d'égalité.

WITH ranked AS (
  SELECT name, department, salary,
         RANK() OVER (
           PARTITION BY department ORDER BY salary DESC
         ) AS rnk
  FROM employees
)
SELECT name, department, salary, rnk
FROM ranked
WHERE rnk <= 3
ORDER BY department, rnk;

Les 3 niveaux distincts les plus élevés avec DENSE_RANK

Lorsque l'exigence est d'obtenir les « 3 niveaux de salaire distincts les plus élevés » et que vous voulez tous les employés appartenant à ces trois niveaux, utilisez DENSE_RANK() <= 3.

Cette requête peut renvoyer beaucoup de lignes : tous les employés des trois tranches de rémunération les plus élevées, quel que soit le nombre d'employés dans chacune. L'idée essentielle est que DENSE_RANK compte les valeurs distinctes ; le filtre sélectionne donc des niveaux de valeurs plutôt qu'un nombre fixe de lignes.

WITH ranked AS (
  SELECT name, salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
  FROM employees
)
SELECT name, salary, drnk
FROM ranked
WHERE drnk <= 3
ORDER BY drnk;

Guide de décision

Faites correspondre la formulation à la fonction :

  • « Exactement N lignes » ou pagination → ROW_NUMBER (ajoutez un critère de départage).
  • « N premiers rangs, les ex æquo partagent un rang » → RANK.
  • « N valeurs, niveaux ou tranches distincts les plus élevés » → DENSE_RANK.

Lorsque la spécification est ambiguë, demandez : « En cas d'égalité à la limite, dois-je inclure toutes les lignes ex æquo ou plafonner le résultat à N ? » Cette question de clarification vous rapporte à elle seule des points.

Les critères de départage restent importants

Même avec RANK ou DENSE_RANK, l'ajout d'une clé ORDER BY secondaire contrôle l'ordre d'affichage des lignes ex æquo et stabilise le résultat. Cela ne change pas les lignes retenues, mais rend les résultats reproductibles.

Avec ROW_NUMBER, le critère de départage est essentiel, car il détermine quelle ligne ex æquo reste après l'application de la limite sur rn.

RANK() OVER (
  PARTITION BY department
  ORDER BY salary DESC, name ASC
) AS rnk

Exemple détaillé : les meilleurs scores

Une table game_scores contient player et score. Le recruteur veut « tous les joueurs occupant les 2 premiers rangs du score ». Une égalité à la première place signifie que deux joueurs occupent le rang 1, puis que le score distinct suivant occupe le rang 2.

Des « rangs » sans saut après une égalité indiquent DENSE_RANK. S'il disait plutôt « les 2 premiers rangs avec des sauts », vous utiliseriez RANK. Soyez attentif à la formulation exacte.

WITH r AS (
  SELECT player, score,
         DENSE_RANK() OVER (ORDER BY score DESC) AS pos
  FROM game_scores
)
SELECT player, score, pos
FROM r
WHERE pos <= 2
ORDER BY pos, player;

Erreurs courantes à éviter

Pièges que les recruteurs surveillent :

  • Utiliser ROW_NUMBER lorsque la question demande d'inclure les ex æquo, en écartant silencieusement une ligne admissible.
  • Confondre le comportement des trous de RANK et de DENSE_RANK.
  • Oublier que les filtres RANK/DENSE_RANK peuvent renvoyer plus de N lignes, puis affirmer que le résultat est incorrect.
  • Omettre PARTITION BY lorsque les N premiers sont demandés par groupe, et classer à la place toute la table.

Vérification rapide

Choisissez la fonction de classement adaptée au comportement des égalités décrit.

Récapitulatif : gérer les égalités

Trois fonctions, trois comportements en cas d’égalité :

  • ROW_NUMBER : toujours unique, exactement N lignes, égalités départagées arbitrairement.
  • RANK : les égalités partagent un rang, puis des écarts apparaissent.
  • DENSE_RANK : les égalités partagent un rang, sans écarts, compte les valeurs distinctes.

Choisissez selon le libellé de la question, posez une question de clarification en cas d’ambiguïté et retenez que les filtres RANK/DENSE_RANK peuvent, par conception, renvoyer plus de N lignes.

Questions Fréquemment Posées

La leçon « Gérer les égalités parmi les N premiers » est-elle gratuite ?

Oui — le texte complet de « Gérer les égalités parmi les N premiers » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Coding Interview Prep, passe à CoddyKit PRO. Le cours Coding Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Gérer les égalités parmi les N premiers » ?

Savoir quand utiliser RANK ou DENSE_RANK pour inclure toutes les lignes à égalité Tu pratiques Coding Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Coding Interview Prep ?

Aucune expérience préalable n'est requise. Coding Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Gérer les égalités parmi les N premiers » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Coding Interview Prep ?

Oui. Chaque leçon Coding Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. N premières lignes par groupe avec ROW_NUMBER
  2. Gérer les égalités parmi les N premiers
  3. Dédupliquer les lignes en toute sécurité
  4. Conserver la dernière ligne par clé
← Retour à Coding Interview Prep