0Pricing
SQL Interview Prep · Leçon

Deuxième salaire le plus élevé : cinq méthodes

Comparer les solutions avec sous-requête, LIMIT/OFFSET et fonctions de fenêtre

Deuxième salaire le plus élevé : cinq méthodes est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 1 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 SQL Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.

La question que tout le monde se voit poser

« Trouvez le deuxième salaire le plus élevé » est la question d’entretien SQL la plus fréquente. Les intervieweurs l’apprécient parce qu’elle admet de nombreuses bonnes réponses et comporte plusieurs pièges subtils.

Supposons une table employee contenant les colonnes id et salary. Votre tâche consiste à renvoyer la deuxième valeur de salaire distincte la plus élevée.

  • Si les salaires sont 300, 200, 200, 100, la réponse est 200, et non la deuxième ligne.
  • S’il n’existe pas de deuxième salaire distinct, la réponse attendue est généralement NULL.

Dans les sections suivantes, nous résoudrons ce problème de cinq façons différentes et verrons dans quels cas chacune est particulièrement utile.

CREATE TABLE employee (
  id     INT PRIMARY KEY,
  salary INT
);

Méthode 1 : MAX des valeurs inférieures au MAX

La solution la plus intuitive consiste à considérer que le deuxième salaire le plus élevé est le salaire maximal strictement inférieur au maximum global.

Cette solution se lit presque comme une phrase en français et fonctionne dans tous les dialectes SQL. La sous-requête interne trouve la valeur la plus élevée, tandis que le MAX externe trouve la plus grande valeur qui lui est inférieure.

Bonus : s’il n’existe pas de deuxième salaire distinct, le MAX externe agrège zéro ligne et renvoie automatiquement NULL. Ce NULL obtenu automatiquement est exactement ce qu’attendent les intervieweurs.

SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);

Pourquoi la sous-requête gère les doublons

Remarquez que nous n’avons jamais utilisé DISTINCT dans la méthode 1, et pourtant les doublons sont correctement gérés.

Si trois personnes gagnent 200 et que la personne la mieux rémunérée gagne 300, la requête interne renvoie 300. Le filtre externe conserve toutes les lignes inférieures à 300, et le MAX de ces lignes vaut 200, quel que soit le nombre de salaires à 200.

Voici l’idée essentielle : les agrégats neutralisent les doublons pour vous. Beaucoup de candidats complexifient inutilement leur solution avec DISTINCT alors que l’agrégat produit déjà le résultat attendu.

Méthode 2 : LIMIT avec OFFSET

Dans MySQL et PostgreSQL, vous pouvez trier les salaires distincts par ordre décroissant et ignorer le premier.

  • OFFSET 1 ignore le salaire le plus élevé.
  • LIMIT 1 ne conserve que le suivant.

DISTINCT est indispensable ici ; sinon, des salaires maximaux en double feraient commencer OFFSET 1 sur une répétition du maximum au lieu du véritable deuxième salaire.

Piège : s’il n’existe aucune deuxième valeur distincte, cette requête renvoie zéro ligne, et non NULL. Nous corrigerons ce cas limite dans la leçon 4.

SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;

Méthode 3 : FETCH pour SQL Server et Oracle

SQL Server et les versions modernes d’Oracle ne prennent pas en charge LIMIT ... OFFSET. Ils utilisent plutôt la syntaxe conforme à la norme ANSI OFFSET ... FETCH.

La logique est identique à celle de la méthode 2 : trier les salaires distincts par ordre décroissant, ignorer une ligne, puis en récupérer une. Connaître la syntaxe propre à chaque dialecte montre à la personne qui vous recrute que vous avez une expérience concrète.

SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

Méthode 4 : fonction de fenêtre DENSE_RANK

L’approche moderne et évolutive utilise une fonction de fenêtre. DENSE_RANK attribue le rang 1 au salaire le plus élevé, le rang 2 au salaire distinct suivant, et donne le même rang aux salaires à égalité, sans sauts.

Nous calculons le rang dans une sous-requête, puis filtrons sur le rang 2 dans la requête externe. Souvenez-vous que vous ne pouvez pas filtrer directement sur une fonction de fenêtre dans WHERE ; l’encapsulation dans une sous-requête est donc obligatoire.

SELECT salary AS second_highest
FROM (
  SELECT salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
  FROM employee
) ranked
WHERE rnk = 2;

Pourquoi DENSE_RANK plutôt que RANK ou ROW_NUMBER

Le choix de la fonction de classement est important pour la sémantique des valeurs « distinctes » :

  • ROW_NUMBER attribue un numéro unique à chaque ligne. Ainsi, deux personnes gagnant 300 seraient les lignes 1 et 2, et le rang 2 serait une répétition du salaire maximal. C’est incorrect.
  • RANK laisse des sauts après les égalités : deux salaires à 300 obtiennent le rang 1, puis le salaire suivant passe directement au rang 3. Vous le manqueriez au rang 2. C’est incorrect.
  • DENSE_RANK donne le même rang aux valeurs à égalité et ne laisse aucun saut ; le rang 2 correspond donc toujours au deuxième salaire distinct. C’est correct.

Méthode 5 : comptage dans une sous-requête corrélée

Voici une astuce classique, antérieure aux fonctions de fenêtre : un salaire est le N-ième plus élevé s’il existe exactement N-1 salaires distincts strictement supérieurs à celui-ci.

Pour le deuxième salaire le plus élevé, nous voulons exactement un salaire distinct supérieur. Cette approche est élégante, mais peut être lente sur les grandes tables, car le comptage interne s’exécute pour chaque ligne externe.

Elle se généralise facilement au N-ième salaire le plus élevé en remplaçant le comptage par N - 1, ce qui explique pourquoi les recruteurs aiment la voir.

SELECT salary AS second_highest
FROM employee e
WHERE 1 = (
  SELECT COUNT(DISTINCT e2.salary)
  FROM employee e2
  WHERE e2.salary > e.salary
);

Un exemple détaillé de bout en bout

Prenons les salaires suivants : 500, 500, 350, 350, 100.

  • Méthode 1 : le MAX vaut 500, et la plus grande valeur inférieure à 500 vaut 350. Réponse : 350.
  • Méthode 4 (DENSE_RANK) : 500 -> rang 1, 350 -> rang 2, 100 -> rang 3. Le rang 2 correspond à 350.
  • Méthode 5 : pour le salaire 350, exactement un salaire distinct (500) est supérieur. La condition est satisfaite. Réponse : 350.

Les cinq méthodes donnent le même résultat : le deuxième salaire distinct le plus élevé est 350, même en présence de doublons.

La méthode à privilégier

Conseils pour un entretien :

  • Commencez par préciser la question : « Voulez-vous des salaires distincts et NULL s’il n’en existe aucun ? » Demander cette précision vous fera gagner des points.
  • DENSE_RANK est la meilleure réponse par défaut ; elle se généralise proprement au N-ième élément et au classement par groupe.
  • MAX inférieur à MAX est la meilleure solution en une ligne et renvoie NULL sans effort supplémentaire.
  • LIMIT/OFFSET est concise, mais propre à un dialecte donné et renvoie aucune ligne dans le cas limite.

Expliquer les compromis à voix haute est ce qui distingue une réponse de niveau intermédiaire d’une réponse de débutant.

Erreurs courantes à éviter

Surveillez les pièges que les recruteurs placent dans leurs questions :

  • Utiliser ROW_NUMBER au lieu de DENSE_RANK et obtenir deux fois le salaire maximal.
  • Oublier DISTINCT dans la version avec LIMIT/OFFSET lorsque plusieurs salaires maximaux sont identiques.
  • Supposer que ORDER BY salary DESC LIMIT 1,1 renvoie une valeur distincte, ce qui n’est pas le cas.
  • Renvoyer la deuxième ligne au lieu de la deuxième valeur.

Vérification rapide

Testez votre compréhension du choix de la fonction de classement.

Récapitulatif

Vous disposez maintenant de cinq méthodes pour trouver le deuxième salaire le plus élevé :

  • MAX inférieur à MAX : portable et renvoie NULL sans effort supplémentaire.
  • LIMIT/OFFSET et OFFSET/FETCH : concises, mais propres à un dialecte donné.
  • DENSE_RANK : le choix par défaut évolutif qui gère correctement les égalités.
  • Comptage corrélé : élégant et généralisable au N-ième élément.

À retenir : demandez si vous avez besoin de valeurs distinctes, privilégiez DENSE_RANK pour gérer les égalités et souvenez-vous des méthodes qui renvoient NULL plutôt qu’aucune ligne lorsqu’une deuxième valeur n’existe pas.

Questions Fréquemment Posées

La leçon « Deuxième salaire le plus élevé : cinq méthodes » est-elle gratuite ?

Oui — le texte complet de « Deuxième salaire le plus élevé : cinq méthodes » 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 SQL Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Deuxième salaire le plus élevé : cinq méthodes » ?

Comparer les solutions avec sous-requête, LIMIT/OFFSET et fonctions de fenêtre Tu pratiques SQL 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 SQL Interview Prep ?

Aucune expérience préalable n'est requise. SQL 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 1 sur 4.

Combien de temps prend la leçon « Deuxième salaire le plus élevé : cinq méthodes » ?

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 SQL Interview Prep ?

Oui. Chaque leçon SQL 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. Deuxième salaire le plus élevé : cinq méthodes
  2. N-ième valeur la plus élevée avec DENSE_RANK
  3. Le plus gros salaire par service
  4. Renvoyer NULL lorsqu’il n’existe aucune n-ième valeur
← Retour à SQL Interview Prep