Die obersten N Zeilen zuverlässig zurückgeben
Warum ORDER BY plus LIMIT ohne Tie-Breaker nichtdeterministisch sein kann
Die obersten N Zeilen zuverlässig zurückgeben ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 3 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.
Der versteckte Fehler bei Top-N-Abfragen
„Geben Sie mir die 5 bestbezahlten Mitarbeiter“ klingt einfach: ORDER BY salary DESC LIMIT 5. Doch Interviewer bauen hier eine Falle ein. Was ist, wenn sechs Personen an der Grenze dasselbe Gehalt haben? Was ist, wenn viele Zeilen gleichauf liegen?
Das Kernproblem ist die Deterministik: Wenn der Sortierschlüssel gleiche Werte enthält, schneidet LIMIT die Ergebnisse willkürlich ab, und die genau zurückgegebenen Zeilen können sich zwischen zwei Ausführungen ändern. Diese Lektion macht Top-N-Abfragen zuverlässig.
Warum ORDER BY + LIMIT nicht deterministisch sein kann
Betrachten Sie Gehälter, bei denen die Ränge 4, 5 und 6 alle 50000 betragen. ORDER BY salary DESC LIMIT 5 muss genau 5 Zeilen zurückgeben, behält also zwei der drei gleichauf liegenden Zeilen und verwirft eine, aber welche zwei ausgewählt werden, ist nicht definiert.
Wenn Sie die Abfrage zweimal ausführen oder der Optimizer seine Ausführungspläne ändert, erhalten Sie möglicherweise andere Personen. Diese Nichtdeterministik ist der Fehler, den Interviewer von Ihnen erkennen lassen möchten.
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;Lösung 1: Einen eindeutigen Tiebreaker hinzufügen
Die einfachste Lösung besteht darin, die Sortierreihenfolge durch Anhängen einer eindeutigen Spalte vollständig zu machen, normalerweise des Primärschlüssels. Nun sind keine zwei Zeilen anhand des vollständigen Schlüssels gleich, sodass die Auswahlgrenze deterministisch und reproduzierbar ist.
Dadurch ändert sich nicht, welche Gehälter erscheinen, aber die Auswahl unter gleichauf liegenden Zeilen bleibt über mehrere Ausführungen hinweg stabil.
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC
LIMIT 5;Lösung 2: Mit WITH TIES alle Gleichstände einschließen
Manchmal lautet die Anforderung nicht „genau N Zeilen“, sondern „alle Personen einschließen, die an der Auswahlgrenze gleichauf liegen“. Der SQL-Standard und SQL Server bieten dafür WITH TIES, das zusätzliche Zeilen zurückgibt, deren ORDER-BY-Wert dem Wert der letzten Zeile entspricht.
Wenn das fünfhöchste Gehalt von drei Personen geteilt wird, gibt diese Variante 7 Zeilen zurück. Beachten Sie, dass WITH TIES ein ORDER BY voraussetzt.
SELECT name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS WITH TIES;Klären Sie zuerst die Anforderung
Fragen Sie den Interviewer vor dem Programmieren: „Wenn es an der Grenze Gleichstände gibt, möchten Sie genau N Zeilen oder alle gleichauf liegenden Zeilen?“ Diese eine klärende Frage zeigt Erfahrung auf Senior-Niveau.
- Genau N, stabil: Einen eindeutigen Tiebreaker hinzufügen.
- Alle Gleichstände einschließen:
WITH TIESoderRANKverwenden. - Unterschiedliche Werte:
DENSE_RANKverwenden.
Der portable Ansatz mit Fensterfunktionen
Viele Engines unterstützen WITH TIES nicht. Das portable und leistungsfähige Muster verwendet eine Ranking-Fensterfunktion in einer Unterabfrage oder CTE und filtert anschließend nach dem Rang. ROW_NUMBER liefert mit einem deterministischen Sortierschlüssel genau N Zeilen.
Sie müssen die Fensterfunktion in eine äußere Abfrage einschließen, weil Sie nicht direkt in WHERE darauf verweisen können.
SELECT name, salary
FROM (
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC, id ASC) AS rn
FROM employees
) ranked
WHERE rn <= 5;RANK zum Beibehalten von Gleichständen
Ersetzen Sie ROW_NUMBER durch RANK, wenn alle gleichauf liegenden Zeilen beibehalten werden sollen und Lücken in der Nummerierung erwünscht sind. Wenn drei Zeilen den Rang 4 teilen, erhalten alle Rang 4 und der nächste Rang ist 7.
Das Filtern mit rank <= 5 gibt anschließend jede Zeile innerhalb der fünf höchsten Gehaltspositionen zurück, einschließlich aller Gleichstände.
SELECT name, salary
FROM (
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employees
) ranked
WHERE rnk <= 5;DENSE_RANK für Top-N unterschiedlicher Werte
„Die Top 3 Gehaltsstufen“ (nicht die Top 3 Personen) bedeutet, dass unterschiedliche Werte gemeint sind. DENSE_RANK weist gleichen Werten denselben Rang zu und überspringt keine Zahlen. Daher gibt dense_rnk <= 3 alle Personen zurück, die eines der drei höchsten unterschiedlichen Gehälter verdienen.
Zu wissen, welche Ranking-Funktion zu welcher Formulierung passt, ist ein klassisches Unterscheidungsmerkmal.
SELECT name, salary
FROM (
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees
) ranked
WHERE drnk <= 3;Sonderfall Top-1
Für die einzelne oberste Zeile funktioniert ORDER BY ... LIMIT 1, allerdings besteht weiterhin das Risiko eines Gleichstands. Wenn Sie jede Zeile zurückgeben möchten, die den Höchstwert enthält, vergleichen Sie mit dem Ergebnis einer MAX-Unterabfrage oder verwenden Sie RANK() = 1.
Die Variante mit der MAX-Unterabfrage ist übersichtlich und läuft in jedem Dialekt.
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);Vergleich der Ansätze
Zusammenfassung: Wann Sie welches Werkzeug für zuverlässige Top-N-Abfragen verwenden:
LIMIT+ eindeutiger Tiebreaker: genau N stabile Zeilen, einfachste Variante.FETCH ... WITH TIES: genau N Zeilen plus Gleichstände an der Grenze, Standard-SQL.ROW_NUMBER: genau N Zeilen, deterministisch und vollständig portabel.RANK: die obersten N Positionen einschließlich aller Gleichstände.DENSE_RANK: die obersten N unterschiedlichen Werte.
Vorschau: Top-N pro Gruppe
Das Fensterfunktionsmuster lässt sich hervorragend verallgemeinern. Fügen Sie PARTITION BY hinzu, um die obersten N Werte innerhalb jeder Gruppe zu erhalten, beispielsweise die beiden Spitzenverdiener pro Abteilung. Nach der Partitionierung gilt weiterhin derselbe Filter rn <= n.
Top-N pro Gruppe gehört zu den häufigsten Aufgaben in echten Vorstellungsgesprächen und basiert genau auf dem Muster, das Sie gerade gelernt haben.
SELECT department, name, salary
FROM (
SELECT department, name, salary,
ROW_NUMBER() OVER (PARTITION BY department
ORDER BY salary DESC, id ASC) AS rn
FROM employees
) ranked
WHERE rn <= 2;Kurztest
Ordnen Sie der Anforderung die richtige Funktion zu.
Zusammenfassung
So geben Sie Top-N zuverlässig zurück:
ORDER BY ... LIMITallein ist nicht deterministisch, wenn der Sortierschlüssel gleiche Werte enthält.- Fügen Sie für stabile Ergebnisse mit genau N Zeilen einen eindeutigen Tiebreaker hinzu.
- Verwenden Sie
WITH TIESoderRANK, um Gleichstände an der Grenze beizubehalten. - Verwenden Sie
DENSE_RANKfür die obersten N unterschiedlichen Werte. - Klären Sie immer, ob der Interviewer genau N Zeilen oder alle Gleichstände erwartet.
Häufig gestellte Fragen
Ist die Lektion „Die obersten N Zeilen zuverlässig zurückgeben“ kostenlos?
Ja — der vollständige Text von „Die obersten N Zeilen zuverlässig zurückgeben“ 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 „Die obersten N Zeilen zuverlässig zurückgeben“?
Warum ORDER BY plus LIMIT ohne Tie-Breaker nichtdeterministisch sein kann 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 3 von 4.
Wie lange dauert die Lektion „Die obersten N Zeilen zuverlässig zurückgeben“?
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
- Sortieren nach mehreren Spalten und Platzierung von NULL
- LIMIT, OFFSET und FETCH FIRST
- Die obersten N Zeilen zuverlässig zurückgeben
- Nach Ausdrücken und Aliasen sortieren