Das zweithöchste Gehalt auf fünf Arten
Lösungen mit Unterabfrage, LIMIT/OFFSET und Fensterfunktionen vergleichen
Das zweithöchste Gehalt auf fünf Arten ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Die Frage, die fast alle bekommen
„Finden Sie das zweithöchste Gehalt“ ist die wohl am häufigsten gestellte SQL-Frage in Vorstellungsgesprächen. Interviewende mögen sie, weil es viele richtige Antworten und mehrere subtile Fallstricke gibt.
Gehen Sie von einer Tabelle employee mit den Spalten id und salary aus. Ihre Aufgabe ist es, den zweithöchsten unterschiedlichen Gehaltswert zurückzugeben.
- Wenn die Gehälter 300, 200, 200, 100 lauten, ist die Antwort 200, nicht die zweite Zeile.
- Wenn es kein zweithöchstes unterschiedliches Gehalt gibt, lautet die erwartete Antwort normalerweise
NULL.
In den nächsten Szenen lösen wir die Aufgabe auf fünf verschiedene Arten und besprechen, wann jede davon besonders geeignet ist.
CREATE TABLE employee (
id INT PRIMARY KEY,
salary INT
);Methode 1: MAX der Werte unterhalb von MAX
Die intuitivste Lösung: Das zweithöchste Gehalt ist das größte Gehalt, das strikt kleiner als das Gesamtmaximum ist.
Diese Lösung liest sich fast wie Englisch und funktioniert in jedem SQL-Dialekt. Die innere Unterabfrage ermittelt den höchsten Wert, und das äußere MAX findet den größten darunterliegenden Wert.
Bonus: Wenn es kein zweithöchstes unterschiedliches Gehalt gibt, aggregiert das äußere MAX über null Zeilen und gibt automatisch NULL zurück. Dieses automatische NULL ist genau das, was Interviewende erwarten.
SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);Warum die Unterabfrage Duplikate korrekt behandelt
Beachten Sie, dass wir in Variante 1 nie DISTINCT verwendet haben und Duplikate trotzdem korrekt behandelt werden.
Wenn drei Personen 200 verdienen und die bestbezahlte Person 300 verdient, liefert die innere Abfrage 300. Der äußere Filter lässt jede Zeile unter 300 zu, und das MAX dieser Werte ist 200 – unabhängig davon, wie viele 200er vorhanden sind.
Das ist die entscheidende Erkenntnis: Aggregatfunktionen fassen Duplikate für Sie zusammen. Viele Bewerber machen die Lösung mit DISTINCT unnötig kompliziert, obwohl das Aggregat bereits das richtige Ergebnis liefert.
Variante 2: LIMIT mit OFFSET
In MySQL und PostgreSQL können Sie unterschiedliche Gehälter absteigend sortieren und das erste überspringen.
OFFSET 1überspringt das höchste Gehalt.LIMIT 1behält nur das nächste Gehalt.
DISTINCT ist hier unverzichtbar. Andernfalls würde OFFSET 1 bei mehreren gleichen Höchstgehältern auf eine Wiederholung des Maximums statt auf das tatsächlich zweithöchste Gehalt zeigen.
Stolperfalle: Wenn kein zweiter unterschiedlicher Wert vorhanden ist, liefert diese Abfrage keine Zeilen, nicht NULL. Diesen Sonderfall beheben wir in Lektion 4.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;Variante 3: FETCH für SQL Server und Oracle
SQL Server und moderne Oracle-Versionen unterstützen LIMIT ... OFFSET nicht. Stattdessen verwenden sie die ANSI-Standardsyntax OFFSET ... FETCH.
Die Logik ist identisch mit Variante 2: unterschiedliche Gehälter absteigend sortieren, eine Zeile überspringen und eine Zeile abrufen. Wenn Sie die Schreibweise für verschiedene SQL-Dialekte kennen, zeigt das einem Interviewer praktische Erfahrung.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;Variante 4: DENSE_RANK-Fensterfunktion
Der moderne, skalierbare Ansatz verwendet eine Fensterfunktion. DENSE_RANK weist dem höchsten Gehalt Rang 1 und dem nächsten unterschiedlichen Gehalt Rang 2 zu. Gleiche Gehälter erhalten denselben Rang, und es werden keine Rangnummern ausgelassen.
Wir berechnen den Rang in einer Unterabfrage und filtern dann in der äußeren Abfrage nach Rang 2. Denken Sie daran: Sie können eine Fensterfunktion nicht direkt in WHERE filtern, daher ist die umschließende Unterabfrage zwingend erforderlich.
SELECT salary AS second_highest
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) ranked
WHERE rnk = 2;Warum DENSE_RANK und nicht RANK oder ROW_NUMBER
Die Wahl der Rankingfunktion ist für die Semantik „distinct“ entscheidend:
ROW_NUMBERgibt jeder Zeile eine eindeutige Nummer. Zwei Personen mit einem Gehalt von 300 wären also Zeile 1 und 2, und Rang 2 wäre eine Wiederholung des höchsten Gehalts. Falsch.RANKlässt nach Gleichständen Rangnummern aus: Zwei Gehälter von 300 erhalten Rang 1, und das nächste Gehalt springt auf Rang 3. Bei Rang 2 würden Sie es übergehen. Falsch.DENSE_RANKgibt gleichen Gehältern denselben Rang und lässt keine Rangnummern aus. Rang 2 ist daher immer das zweithöchste unterschiedliche Gehalt. Richtig.
Variante 5: Zählung mit korrelierter Unterabfrage
Ein klassischer Trick aus der Zeit vor Fensterfunktionen: Ein Gehalt ist das N.-höchste, wenn genau N-1 unterschiedliche Gehälter strikt höher sind.
Für das zweithöchste Gehalt benötigen wir genau ein unterschiedliches höheres Gehalt. Dieser Ansatz ist elegant, kann bei großen Tabellen aber langsam sein, weil die innere Zählung für jede äußere Zeile ausgeführt wird.
Er lässt sich gut auf das N.-höchste Gehalt verallgemeinern, indem die Zählung auf N - 1 geändert wird. Deshalb sehen Interviewer diesen Ansatz gerne.
SELECT salary AS second_highest
FROM employee e
WHERE 1 = (
SELECT COUNT(DISTINCT e2.salary)
FROM employee e2
WHERE e2.salary > e.salary
);Ein durchgängiges Beispiel
Nehmen Sie die Gehälter 500, 500, 350, 350, 100.
- Variante 1: MAX ist 500, der größte Wert unter 500 ist 350. Ergebnis: 350.
- Variante 4 (DENSE_RANK): 500 → Rang 1, 350 → Rang 2, 100 → Rang 3. Rang 2 ist 350.
- Variante 5: Für das Gehalt 350 ist genau ein unterschiedliches Gehalt (500) höher. Treffer. Ergebnis: 350.
Alle fünf Methoden liefern dasselbe Ergebnis: Das zweithöchste unterschiedliche Gehalt ist 350, auch wenn Duplikate vorhanden sind.
Welche Variante sollten Sie verwenden
Hinweise für Bewerbungsgespräche:
- Formulieren Sie zuerst die Frage: „Benötigen Sie unterschiedliche Gehälter und
NULL, wenn keines vorhanden ist?“ Mit einer solchen Klärung sammeln Sie Pluspunkte. - DENSE_RANK ist normalerweise die stärkste Antwort. Der Ansatz lässt sich sauber auf das N.-höchste Gehalt und auf Gruppen verallgemeinern.
- MAX unter MAX ist die beste Einzeiler-Lösung und liefert automatisch
NULL. - LIMIT/OFFSET ist kompakt, aber dialektspezifisch und liefert im Sonderfall keine Zeilen.
Wenn Sie die Abwägungen laut ansprechen, hebt Sie das von einer Antwort auf Junior-Niveau ab.
Häufige Fehler, die Sie vermeiden sollten
Achten Sie auf diese Stolperfallen, die Interviewer gerne einbauen:
ROW_NUMBERstattDENSE_RANKverwenden und dadurch das höchste Gehalt zweimal erhalten.- In der LIMIT/OFFSET-Variante
DISTINCTvergessen, wenn es mehrere gleiche Höchstgehälter gibt. - Annehmen, dass
ORDER BY salary DESC LIMIT 1,1einen unterschiedlichen Wert zurückgibt – das tut es nicht. - Die zweite Zeile statt des zweiten Werts zurückgeben.
Kurzer Test
Testen Sie Ihr Verständnis für die Wahl der Rankingfunktion.
Zusammenfassung
Sie kennen jetzt fünf Möglichkeiten, das zweithöchste Gehalt zu finden:
- MAX unter MAX – portabel und liefert automatisch
NULL. - LIMIT/OFFSET und OFFSET/FETCH – kompakt, aber dialektspezifisch.
- DENSE_RANK – der skalierbare Standardansatz, der Gleichstände korrekt behandelt.
- Korrelierte Zählung – elegant und auf das N.-höchste Gehalt verallgemeinerbar.
Die wichtigsten Punkte: Klären Sie, ob Sie unterschiedliche Werte benötigen, bevorzugen Sie bei Gleichständen DENSE_RANK, und behalten Sie im Blick, welche Methoden bei einem nicht vorhandenen zweiten Wert NULL beziehungsweise keine Zeilen zurückgeben.
Häufig gestellte Fragen
Ist die Lektion „Das zweithöchste Gehalt auf fünf Arten“ kostenlos?
Ja — der vollständige Text von „Das zweithöchste Gehalt auf fünf Arten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Das zweithöchste Gehalt auf fünf Arten“?
Lösungen mit Unterabfrage, LIMIT/OFFSET und Fensterfunktionen vergleichen Du übst SQL Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. SQL Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Das zweithöchste Gehalt auf fünf Arten“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede SQL Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Das zweithöchste Gehalt auf fünf Arten
- Der n-höchste Wert mit DENSE_RANK
- Der Spitzenverdiener je Abteilung
- NULL zurückgeben, wenn kein n-ter Wert existiert