SQL Interview Prep · Lektion

OVER, PARTITION BY und ORDER BY

Den Aufbau einer Fensterdefinition verstehen und erfahren, wie Partitionen die Berechnung zurücksetzen

Lektion 1 von 413 Schritte

OVER, PARTITION BY und ORDER BY 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.

Warum Interviewer zu Fensterfunktionen greifen

Eine Fensterfunktion führt eine Berechnung über eine Gruppe von Zeilen durch, die mit der aktuellen Zeile zusammenhängen, ohne sie wie GROUP BY zusammenzufassen. Diese eine Eigenschaft ist der Grund, warum Interviewer sie so schätzen: Sie behalten jede Detailzeile und erhalten gleichzeitig ein Aggregat, einen Rang oder eine laufende Summe.

  • GROUP BY liefert eine Zeile pro Gruppe.
  • Fensterfunktion liefert jede Eingabezeile mit einer zusätzlichen berechneten Spalte.

Wenn ein Interviewer sagt: „Zeigen Sie jeden Mitarbeiter und das durchschnittliche Gehalt seiner Abteilung in derselben Zeile“, prüft er, ob Sie statt eines Self-Joins eine Fensterfunktion verwenden.

Der Aufbau der OVER-Klausel

Auf jede Fensterfunktion folgt eine OVER (...)-Klausel. Die Klausel besteht aus drei optionalen Teilen, deren genaue Benennung Interviewer beeindruckt:

  • PARTITION BY — teilt die Zeilen in Gruppen auf; die Funktion beginnt in jeder Gruppe neu.
  • ORDER BY — ordnet die Zeilen innerhalb jeder Partition (erforderlich für Rangbildung und laufende Summen).
  • Frame — begrenzt, welche Zeilen in die Berechnung einfließen (ROWS/RANGE).

Ein leeres OVER () behandelt die gesamte Ergebnismenge als eine Partition.

SELECT
  name,
  department,
  salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

Fensterfunktion vs. Aggregat: dieselbe Funktion, anderes Ergebnis

Dieselbe Aggregatfunktion verhält sich als Fensterfunktion anders. Vergleichen Sie die beiden folgenden Abfragen auf konzeptioneller Ebene.

  • AVG(salary) mit GROUP BY department liefert eine Zeile pro Abteilung.
  • AVG(salary) OVER (PARTITION BY department) liefert jeden Mitarbeiter, ergänzt um den Durchschnitt der jeweiligen Abteilung.

Interviewtipp: Betonen Sie, dass die Fenstervariante kein GROUP BY erfordert und keine doppelten Detailzeilen entfernt.

-- Aggregate: collapses
SELECT department, AVG(salary)
FROM employees
GROUP BY department;

-- Window: preserves every row
SELECT department, name, AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

PARTITION BY: Zurücksetzen der Berechnung

PARTITION BY entspricht bei Fensterfunktionen dem GROUP BY bei Aggregatfunktionen, mit dem Unterschied, dass es die Zeilen nicht zusammenfasst. Jeder unterschiedliche Partitionswert erhält eine eigene unabhängige Berechnung.

Im Beispiel beginnt die Zeilennummerierung für jede Abteilung bei 1. Ohne PARTITION BY würde die Nummerierung über alle Mitarbeiter hinweg fortlaufend sein.

  • Sie können nach einer oder mehreren Spalten partitionieren.
  • Ohne PARTITION BY gibt es eine einzige große Partition (die gesamte Ergebnismenge).
SELECT
  department,
  name,
  ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees;

ORDER BY innerhalb von OVER

Das ORDER BY innerhalb von OVER ist nicht dasselbe wie das abschließende ORDER BY der Abfrage. Es legt lediglich die Reihenfolge der Zeilen innerhalb jeder Partition fest, in der die Funktion arbeitet.

  • Ranking-Funktionen (ROW_NUMBER, RANK) benötigen es zwingend – sie brauchen eine Reihenfolge, nach der sie den Rang vergeben.
  • Einfache Aggregatfunktionen über eine Partition benötigen es nicht, außer wenn Sie eine laufende Berechnung wünschen.

Ein häufiger Fehler in Vorstellungsgesprächen besteht darin, das ORDER BY des Fensters mit der Darstellungsreihenfolge der Ausgabe zu verwechseln.

SELECT
  name,
  hire_date,
  ROW_NUMBER() OVER (ORDER BY hire_date) AS seniority_rank
FROM employees
ORDER BY name;  -- output order is independent of the window order

PARTITION BY und ORDER BY kombinieren

Die klassische Ranking-Fensterfunktion kombiniert beides: PARTITION BY gruppiert, anschließend ordnet ORDER BY die Zeilen innerhalb jeder Gruppe.

Lesen Sie die folgende Spezifikation so: „Innerhalb jeder Abteilung werden die Mitarbeiter nach Gehalt absteigend sortiert und nummeriert.“ Die bestbezahlte Person in jeder Abteilung erhält die Zeilennummer 1.

Diese einzelne Spezifikation bildet die Grundlage für die häufigsten Interviewaufgaben zu Fensterfunktionen, einschließlich Top-N-pro-Gruppe.

SELECT
  department,
  name,
  salary,
  ROW_NUMBER() OVER (
    PARTITION BY department
    ORDER BY salary DESC
  ) AS dept_salary_rank
FROM employees;

ORDER BY verändert das Verhalten von Aggregatfunktionen

Hier prüfen Interviewer einen subtilen Punkt: Wenn Sie einer Aggregatfunktion im Fenster ein ORDER BY hinzufügen, wird daraus eine laufende Berechnung, weil ein impliziter Frame („vom Anfang der Partition bis zur aktuellen Zeile“) greift.

  • SUM(x) OVER (PARTITION BY g) → dieselbe Gruppensumme in jeder Zeile.
  • SUM(x) OVER (PARTITION BY g ORDER BY d) → eine laufende Summe bis zur aktuellen Zeile.

Wer weiß, dass ORDER BY implizit einen Frame hinzufügt, hebt sich von Junior-Bewerbern ab.

SELECT
  account_id,
  txn_date,
  amount,
  SUM(amount) OVER (
    PARTITION BY account_id
    ORDER BY txn_date
  ) AS running_balance
FROM transactions;

Wo Fensterfunktionen zulässig sind

Fensterfunktionen dürfen nur in der SELECT-Liste und in der ORDER BY-Klausel vorkommen. In WHERE, GROUP BY oder HAVING sind sie nicht zulässig.

Der Grund hängt mit der logischen Ausführungsreihenfolge zusammen: Fensterfunktionen werden nachdem WHERE, GROUP BY und HAVING ausgeführt wurden, ausgewertet. Die Zeilen sind also bereits ausgewählt, bevor die Fensterfunktion sie überhaupt sieht.

Deshalb müssen Sie zum Filtern nach einem Rang eine Unterabfrage oder CTE verwenden – ein Punkt, der in einer späteren Lektion ausführlich behandelt wird.

-- This FAILS: window function in WHERE
-- SELECT name FROM employees
-- WHERE ROW_NUMBER() OVER (ORDER BY salary) = 1;

-- This works: window in SELECT, filter outside
SELECT * FROM (
  SELECT name, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
  FROM employees
) t
WHERE rn = 1;

Mehrere Fensterfunktionen in einer Abfrage

Sie können mehrere Fensterfunktionen in derselben SELECT-Anweisung verwenden, jeweils mit einer eigenen oder einer gemeinsamen Spezifikation. Die Datenbank berechnet sie in einem Durchlauf über die partitionierten Daten.

Das ist in Vorstellungsgesprächen hilfreich, wenn Sie gleichzeitig einen Rang und den Abteilungsdurchschnitt benötigen. Wenn zwei Funktionen dieselbe Spezifikation verwenden, können Sie sie in manchen Dialekten mit einer WINDOW-Klausel benennen und so Wiederholungen vermeiden.

SELECT
  name,
  department,
  salary,
  ROW_NUMBER() OVER w  AS rn,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees
WINDOW w AS (PARTITION BY department ORDER BY salary DESC);

Beispiel: Gehalt im Vergleich zum Abteilungsdurchschnitt

Eine häufige Frage im Analysten-Kontext lautet: „Listen Sie jeden Mitarbeiter mit seinem Gehalt, dem Abteilungsdurchschnitt und der Differenz auf.“ Eine Fensterexpression erledigt den Hauptteil der Arbeit, die Arithmetik den Rest.

Beachten Sie, dass es kein GROUP BY gibt und die Zeile jedes Mitarbeiters erhalten bleibt. dept_avg wird für alle Mitarbeiter derselben Abteilung wiederholt – genau das ermöglicht den zeilenweisen Vergleich.

SELECT
  name,
  department,
  salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg,
  salary - AVG(salary) OVER (PARTITION BY department) AS diff_from_avg
FROM employees
ORDER BY department, salary DESC;

Häufige Fehler, auf die Interviewer achten

Vermeiden Sie diese Stolperfallen, wenn Fensterfunktionen zur Sprache kommen:

  • Eine Fensterfunktion in WHERE oder HAVING verwenden – unzulässig; verwenden Sie stattdessen eine Unterabfrage.
  • Bei einer Ranking-Funktion das ORDER BY vergessen – die Ergebnisse werden beliebig.
  • Annehmen, dass PARTITION BY die Zeilenanzahl verringert – das tut es nie.
  • Das ORDER BY des Fensters mit der abschließenden Ausgabereihenfolge verwechseln.
  • Einer Aggregatfunktion im Fenster ein ORDER BY hinzufügen, ohne zu erkennen, dass daraus eine laufende Summe geworden ist.

Schnelltest

Testen Sie, wie gut Sie die Fensterspezifikation verstanden haben.

Zusammenfassung: Die Fensterspezifikation

Sie kennen jetzt den Aufbau von OVER (...):

  • Fensterfunktionen behalten jede Zeile bei und berechnen Werte über zugehörige Zeilen hinweg.
  • PARTITION BY gruppiert die Zeilen und setzt die Berechnung zurück; es entfernt niemals Zeilen.
  • ORDER BY legt die Reihenfolge der Zeilen innerhalb einer Partition fest; Ranking-Funktionen benötigen es, und bei Aggregatfunktionen macht es die Berechnung laufend.
  • Fensterfunktionen sind nur in SELECT und ORDER BY zulässig – niemals in WHERE/HAVING.

Als Nächstes vergeben Sie mit ROW_NUMBER deterministische Sequenznummern.

Kostenlos starten

Lerne SQL mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
30
Lektionen
120

Häufig gestellte Fragen

Ist die Lektion „OVER, PARTITION BY und ORDER BY“ kostenlos?

Ja — der vollständige Text von „OVER, PARTITION BY und ORDER BY“ 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 „OVER, PARTITION BY und ORDER BY“?

Den Aufbau einer Fensterdefinition verstehen und erfahren, wie Partitionen die Berechnung zurücksetzen 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 „OVER, PARTITION BY und ORDER BY“?

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. OVER, PARTITION BY und ORDER BY
  2. ROW_NUMBER für eine eindeutige Reihenfolge
  3. RANK oder DENSE_RANK bei Gleichständen
  4. Nach einem Fensterergebnis filtern
← Zurück zu SQL Interview Prep