0Pricing
SQL Interview Prep · Lektion

Gleichstände bei den obersten N Werten behandeln

RANK oder DENSE_RANK verwenden, damit bei Gleichständen alle betreffenden Zeilen enthalten sind

Gleichstände bei den obersten N Werten behandeln ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 2 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 Anschlussfrage zu Gleichständen

Nachdem Sie Top-N mit ROW_NUMBER beherrschen, verschärft der Interviewer die Frage: „Was ist, wenn zwei Mitarbeiter am Grenzwert genau dasselbe Gehalt haben? Sollen beide aufgenommen werden?“

Das unterscheidet Kandidaten, die eine einzelne Abfrage auswendig gelernt haben, von denen, die die Bedeutung der Rangfunktionen verstehen. Die Antwort hängt davon ab, ob Sie ROW_NUMBER, RANK oder DENSE_RANK wählen. Diese Lektion ordnet jede Funktion der jeweiligen fachlichen Absicht zu.

ROW_NUMBER verbirgt Gleichstände

ROW_NUMBER weist jeder Zeile eine strikt eindeutige Ganzzahl zu. Auch wenn zwei Zeilen beim Sortierschlüssel gleichauf liegen, erhält eine davon 2 und die andere 3, und zwar in einer beliebigen Reihenfolge.

Die Folge: Ein Filter mit WHERE rn <= 3 gibt genau 3 Zeilen zurück und kann dabei stillschweigend eine gleichauf liegende Zeile ausschließen, die eigentlich hätte aufgenommen werden sollen. Das ist in Ordnung, wenn Sie tatsächlich eine feste Anzahl wünschen, aber falsch, wenn alle Gleichstände berücksichtigt werden sollen.

-- 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 lässt Lücken

RANK weist gleichauf liegenden Zeilen denselben Rang zu und überspringt anschließend Werte, um die Gleichstände zu berücksichtigen. Zwei Zeilen auf Rang 2 erhalten beide den Rang 2, und die folgende Zeile springt auf Rang 4 (nicht 3).

Verwenden Sie RANK, wenn Sie die „Top 3 Plätze“ möchten und ein Platz von mehreren Personen belegt werden kann – wie bei echten Wettbewerbsranglisten, bei denen es nach zwei Silbermedaillen keinen dritten Platz gibt.

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

DENSE_RANK hat keine Lücken

DENSE_RANK weist gleichauf liegenden Zeilen ebenfalls denselben Rang zu, überspringt danach aber keinen Wert. Zwei Zeilen auf Rang 2 erhalten beide den Rang 2, und der nächste unterschiedliche Wert erhält den Rang 3.

Verwenden Sie DENSE_RANK, wenn es um unterschiedliche Werte geht: „die 3 höchsten unterschiedlichen Gehaltsstufen“ oder „die 3 höchsten Preisstufen“. Gezählt werden eindeutige Werte, nicht Zeilen.

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

Direkter Vergleich

Für die Gehaltsliste 100, 90, 90, 80 liefern die drei Funktionen:

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

Diese Tabelle sollten Sie auswendig beherrschen. Der Interviewer bittet Sie möglicherweise einfach, sie für eine bestimmte Liste auszufüllen; das korrekte Verhalten der Lücken ist dabei der entscheidende Punkt.

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;

Alle gleichauf liegenden Zeilen mit RANK aufnehmen

Um „Top 3, aber alle am Grenzwert gleichauf liegenden Personen aufnehmen“ zu beantworten, filtern Sie mit RANK() <= 3. Wenn zwei Personen Rang 3 teilen, erscheinen beide, sodass das Ergebnis mehr als 3 Zeilen enthalten kann.

Das ist die Bedeutung von Fragen nach den „Top 3 Plätzen“ im Gegensatz zu „beliebigen 3 Zeilen“. Geben Sie ausdrücklich an, dass die Zeilenanzahl bei Gleichständen N überschreiten kann.

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;

Die 3 höchsten unterschiedlichen Stufen mit DENSE_RANK

Wenn die Anforderung lautet, die „3 höchsten unterschiedlichen Gehaltsstufen“ zu ermitteln und jeden Mitarbeiter auf diesen drei Stufen aufzunehmen, verwenden Sie DENSE_RANK() <= 3.

Das Ergebnis kann viele Zeilen enthalten: alle Mitarbeiter in den drei höchsten Gehaltsstufen, unabhängig davon, wie viele Personen diese Stufen haben. Die entscheidende Erkenntnis ist, dass DENSE_RANK unterschiedliche Werte zählt. Der Filter wählt also Wertestufen und keine feste Anzahl von Zeilen aus.

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;

Entscheidungshilfe

Ordnen Sie die Formulierung der passenden Funktion zu:

  • „Genau N Zeilen“ oder Seitennummerierung → ROW_NUMBER (fügen Sie einen Tiebreaker hinzu).
  • „Top N Plätze, Gleichstände teilen sich einen Platz“ → RANK.
  • „Top N unterschiedliche Werte / Stufen / Kategorien“ → DENSE_RANK.

Wenn die Spezifikation unklar ist, fragen Sie: „Wenn am Grenzwert ein Gleichstand vorliegt, soll ich alle gleichauf liegenden Zeilen aufnehmen oder bei N Zeilen begrenzen?“ Diese klärende Frage bringt Ihnen bereits Punkte.

Tiebreaker bleiben wichtig

Auch bei RANK oder DENSE_RANK steuert ein zusätzlicher Schlüssel in ORDER BY die Anzeigereihenfolge gleichauf liegender Zeilen und hält die Ausgabe stabil. Er ändert nicht, welche Zeilen die Bedingungen erfüllen, macht die Ergebnisse aber reproduzierbar.

Bei ROW_NUMBER ist der Tiebreaker unverzichtbar, weil er bestimmt, welche gleichauf liegende Zeile den rn-Filter überhaupt übersteht.

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

Durchgerechnetes Beispiel: Spitzenreiter

Eine Tabelle game_scores enthält player und score. Der Interviewer möchte „alle Spieler auf den Top-2-Punktplätzen“. Ein Gleichstand auf dem ersten Platz bedeutet, dass zwei Spieler auf Position 1 liegen und der nächste unterschiedliche Punktestand Position 2 erhält.

„Positionen“ ohne Überspringen nach einem Gleichstand weist auf DENSE_RANK hin. Wenn stattdessen von „den Top-2-Plätzen mit Überspringen“ die Rede wäre, würden Sie zu RANK wechseln. Achten Sie auf die genaue Formulierung.

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;

Häufige Fehler vermeiden

Auf diese Stolperfallen achten Interviewer:

  • ROW_NUMBER zu verwenden, obwohl die Frage die Aufnahme von Gleichständen verlangt, und dadurch stillschweigend eine berechtigte Zeile auszuschließen.
  • Das Verhalten der Lücken bei RANK und DENSE_RANK zu verwechseln.
  • Zu vergessen, dass Filter mit RANK/DENSE_RANK mehr als N Zeilen zurückgeben können, und anschließend zu behaupten, das Ergebnis sei falsch.
  • PARTITION BY zu vergessen, wenn Top-N pro Gruppe gefragt ist, und stattdessen die gesamte Tabelle zu rangen.

Kurztest

Wählen Sie die richtige Ranking-Funktion für das beschriebene Verhalten bei Gleichständen aus.

Rückblick: Umgang mit Gleichständen

Drei Funktionen, drei Verhaltensweisen bei Gleichständen:

  • ROW_NUMBER: immer eindeutig, genau N Zeilen, Gleichstände werden beliebig aufgelöst.
  • RANK: Gleichstände teilen sich einen Rang, danach entstehen Lücken.
  • DENSE_RANK: Gleichstände teilen sich einen Rang, es entstehen keine Lücken und unterschiedliche Werte werden gezählt.

Wählen Sie die Funktion anhand der Formulierung der Frage aus, stellen Sie bei Unklarheit eine klärende Frage und denken Sie daran, dass Filter mit RANK/DENSE_RANK designbedingt mehr als N Zeilen zurückgeben können.

Häufig gestellte Fragen

Ist die Lektion „Gleichstände bei den obersten N Werten behandeln“ kostenlos?

Ja — der vollständige Text von „Gleichstände bei den obersten N Werten behandeln“ 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 „Gleichstände bei den obersten N Werten behandeln“?

RANK oder DENSE_RANK verwenden, damit bei Gleichständen alle betreffenden Zeilen enthalten sind 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 2 von 4.

Wie lange dauert die Lektion „Gleichstände bei den obersten N Werten behandeln“?

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

  1. Die obersten N Zeilen je Gruppe mit ROW_NUMBER
  2. Gleichstände bei den obersten N Werten behandeln
  3. Zeilen sicher deduplizieren
  4. Die aktuellste Zeile je Schlüssel beibehalten
← Zurück zu SQL Interview Prep