RANK oder DENSE_RANK bei Gleichständen
Die klassische Frage nach Rangfolgen mit oder ohne Lücken bei gleichen Werten
RANK oder DENSE_RANK bei Gleichständen ist eine kostenlose Coding 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 Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Die drei Ranking-Funktionen im Vergleich
SQL bietet drei Ranking-Fensterfunktionen, und die am häufigsten gestellte Frage zu Fenstern ist, wie sie sich bei Gleichständen unterscheiden:
- ROW_NUMBER – immer eindeutig; Gleichstände erhalten beliebige unterschiedliche Nummern.
- RANK – Gleichstände erhalten denselben Rang, danach wird der nächste Rang übersprungen (es entsteht eine Lücke).
- DENSE_RANK – Gleichstände erhalten denselben Rang, danach wird der nächste Rang nicht übersprungen (keine Lücke).
Diese Unterscheidung sofort erklären zu können, ist ein zuverlässiges Signal im Vorstellungsgespräch.
Eine konkrete Beispieltabelle
Stellen Sie sich fünf absteigend sortierte Punktzahlen vor: 100, 90, 90, 80, 70. Sehen Sie sich an, wie die einzelnen Funktionen sie nummerieren.
- ROW_NUMBER: 1, 2, 3, 4, 5
- RANK: 1, 2, 2, 4, 5 (überspringt nach dem Gleichstand die 3)
- DENSE_RANK: 1, 2, 2, 3, 4 (keine Lücke)
Merken Sie sich dieses Beispiel mit 100/90/90/80/70 – damit können Sie die Frage sofort beantworten.
SELECT
score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS rownum,
RANK() OVER (ORDER BY score DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense
FROM scores;Wie RANK die Lücke berechnet
RANK weist jeder Zeile einen Rang zu, der eins plus der Anzahl der Zeilen entspricht, die in der Sortierreihenfolge strikt vor ihr stehen. Die beiden Zeilen mit dem Wert 90 werden jeweils von einer Zeile (der 100) angeführt und erhalten daher beide Rang 2. Vor dem nächsten, niedrigeren Wert stehen drei Zeilen, daher springt der Rang auf 4.
Deshalb entspricht RANK einer Wettbewerbswertung: geteiltes Silber, keine Bronzemedaille.
-- scores 100,90,90,80 -> RANK = 1,2,2,4
SELECT score, RANK() OVER (ORDER BY score DESC) AS rnk
FROM scores;Wie DENSE_RANK Lücken vermeidet
DENSE_RANK weist einen Rang zu, der eins plus der Anzahl der unterschiedlichen Werte entspricht, die vor dem aktuellen Wert liegen. Nach dem Gleichstand bei 90 liegen vor der 80 nur zwei unterschiedliche Werte (100 und 90), daher erhält sie Rang 3 – ohne Lücke.
Verwenden Sie DENSE_RANK, wenn es auf die Positionen unterschiedlicher Werte ankommt, etwa bei „dem zweithöchsten Gehalt“, wobei Gleichstände nur einmal zählen.
-- scores 100,90,90,80 -> DENSE_RANK = 1,2,2,3
SELECT score, DENSE_RANK() OVER (ORDER BY score DESC) AS dense
FROM scores;Wann welche Funktion verwenden
Ein kurzer Entscheidungsleitfaden, den Interviewer gern hören:
- Benötigen Sie genau eine Zeile pro Position (aktuellster Datensatz, Paginierung)? → ROW_NUMBER.
- Benötigen Sie eine Rangliste, in der Gleichstände denselben Rang erhalten und die Lücken korrekt sind (Sportwertung, Top 3 einschließlich Gleichständen)? → RANK.
- Benötigen Sie den N.-höchsten unterschiedlichen Wert (das N.-höchste Gehalt)? → DENSE_RANK.
Die falsche Wahl verändert, welche Zeilen zurückgegeben werden. Begründen Sie Ihre Auswahl daher laut.
Ranking innerhalb von Partitionen
Alle drei Funktionen akzeptieren PARTITION BY, um innerhalb jeder Gruppe unabhängig voneinander zu ranken. Jede Partition beginnt wieder bei Rang 1.
Hier rankt jede Abteilung ihre eigenen Mitarbeiter nach Gehalt, wobei Gleichstände mit DENSE_RANK behandelt werden. Der Spitzenverdiener jeder Abteilung erhält Rang 1, und Mitarbeiter mit demselben Gehalt teilen sich einen Rang.
SELECT
department,
name,
salary,
DENSE_RANK() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS salary_rank
FROM employees;Durchgearbeitetes Beispiel: Top 3 einschließlich Gleichständen
„Geben Sie die drei höchsten Gehälter pro Abteilung zurück. Wenn mehrere Personen beim dritten Platz gleichauf liegen, sollen sie alle enthalten sein.“ Dafür benötigen Sie RANK oder DENSE_RANK, nicht ROW_NUMBER.
Mit DENSE_RANK <= 3 behalten Sie die drei höchsten unterschiedlichen Gehaltsstufen und alle Mitarbeiter auf diesen Stufen – genau das bedeutet „einschließlich Gleichständen“.
SELECT department, name, salary, salary_rank
FROM (
SELECT department, name, salary,
DENSE_RANK() OVER (
PARTITION BY department ORDER BY salary DESC
) AS salary_rank
FROM employees
) t
WHERE salary_rank <= 3;Durchgearbeitetes Beispiel: Zweithöchstes Gehalt
Die berühmteste SQL-Frage in Vorstellungsgesprächen. Die robuste Lösung verwendet DENSE_RANK, damit doppelte Spitzengehälter den tatsächlich zweithöchsten Wert nicht unerreichbar machen.
Wenn drei Personen das maximale Gehalt verdienen, identifiziert DENSE_RANK = 2 weiterhin korrekt das nächste unterschiedliche Gehalt. ROW_NUMBER = 2 würde dagegen einfach eine weitere Person mit dem Spitzengehalt zurückgeben.
SELECT DISTINCT salary AS second_highest
FROM (
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS dr
FROM employees
) t
WHERE dr = 2;RANK vs. DENSE_RANK beim „N.-höchsten“ Wert
Warum sollten Sie für Aufgaben zum N.-höchsten Wert DENSE_RANK statt RANK verwenden? Weil RANK Lücken lässt. Bei den Gehältern 100, 100, 90 hat der Wert 90 den RANK = 3, aber den DENSE_RANK = 2.
Wenn die Frage nach dem „zweithöchsten unterschiedlichen Gehalt“ fragt, würde ein Filter mit RANK = 2 nichts zurückgeben, während DENSE_RANK = 2 korrekt 90 liefert. Ordnen Sie „N.-höchster unterschiedlicher Wert“ immer DENSE_RANK zu.
-- salaries 100,100,90
-- RANK: 1,1,3 -> WHERE rank = 2 returns NOTHING
-- DENSE_RANK: 1,1,2 -> WHERE dense_rank = 2 returns 90Hinweise zu SQL-Dialekten
Die gute Nachricht: ROW_NUMBER, RANK und DENSE_RANK sind im SQL-Standard definiert und verhalten sich in PostgreSQL, SQL Server, Oracle, MySQL 8+, BigQuery und Snowflake identisch. Die oben beschriebenen Regeln für Gleichstände gelten überall.
Eine verwandte Funktion, PERCENT_RANK, baut auf RANK auf und liefert eine relative Position zwischen 0 und 1 – erwähnenswert, wenn ein Interviewer nach Ranking in Perzentilen fragt.
Häufige Fehler
Achten Sie auf Folgendes:
ROW_NUMBERfür den „N.-höchsten Wert“ verwenden und dadurch Zeilen mit Gleichständen übersehen.RANKverwenden, obwohl die Frage unterschiedliche Werte meint, und dann wegen der Lücken leere Ergebnisse erhalten.ORDER BYinnerhalb vonOVERvergessen – ohne diese Angabe ist das Ranking bedeutungslos.- Das Ranking direkt in
WHEREfiltern, statt es in einer äußeren Abfrage zu filtern.
Kurze Überprüfung
Wenden Sie die Regeln für Gleichstände an.
Zusammenfassung: Mit und ohne Lücken
Sie können jetzt sofort die richtige Ranking-Funktion auswählen:
- ROW_NUMBER: eindeutige Nummern, keine geteilten Ränge.
- RANK: Gleichstände teilen sich einen Rang, danach folgt eine Lücke (1,2,2,4).
- DENSE_RANK: Gleichstände teilen sich einen Rang, ohne Lücke (1,2,2,3).
- „N.-höchster unterschiedlicher Wert“ →
DENSE_RANK; „Top N einschließlich Gleichständen“ →RANK/DENSE_RANK; „eine Zeile pro Position“ →ROW_NUMBER.
Als Nächstes sehen Sie, wie Sie tatsächlich nach einem Fensterergebnis filtern, da dies in WHERE nicht möglich ist.
Häufig gestellte Fragen
Ist die Lektion „RANK oder DENSE_RANK bei Gleichständen“ kostenlos?
Ja — der vollständige Text von „RANK oder DENSE_RANK bei Gleichständen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „RANK oder DENSE_RANK bei Gleichständen“?
Die klassische Frage nach Rangfolgen mit oder ohne Lücken bei gleichen Werten Du übst Coding 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 Coding Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. Coding 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 „RANK oder DENSE_RANK bei Gleichständen“?
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 Coding Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede Coding 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
- OVER, PARTITION BY und ORDER BY
- ROW_NUMBER für eine eindeutige Reihenfolge
- RANK oder DENSE_RANK bei Gleichständen
- Nach einem Fensterergebnis filtern