0Pricing
SQL Interview Prep · Lektion

Kumulative Summen mit Fensterrahmen

Mit SUM OVER und einem geordneten Fensterrahmen eine laufende Summe erstellen

Kumulative Summen mit Fensterrahmen 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 nach der laufenden Summe

Fast jedes Vorstellungsgespräch für Analysten enthält eine Frage wie: „Zeigen Sie mir den kumulierten Umsatz im Zeitverlauf.“ Eine laufende Summe wächst Zeile für Zeile und umfasst alle Werte vom Anfang bis zur aktuellen Zeile.

Bevor es Fensterfunktionen gab, lösten Kandidaten diese Aufgabe mit einem langsamen Self-Join oder einer korrelierten Unterabfrage. Die moderne, erwartete Antwort lautet SUM(...) OVER (ORDER BY ...). Wenn Sie die Variante mit Fenster-Frame kennen, zeigt das, dass Sie SQL verstehen, wie es etwa seit 2012 geschrieben wird.

Aufbau einer geordneten Fenster-Summe

Eine laufende Summe ist einfach ein Aggregat, das in eine Fensterfunktion umgewandelt wurde. Sie behalten SUM(amount) bei, fügen aber eine OVER-Klausel mit einem ORDER BY hinzu.

Das ORDER BY innerhalb von OVER macht die Summe kumulativ: Es weist SQL an, die Zeilen in dieser Reihenfolge aufzusummieren. Ohne ORDER BY würde SUM für jede Zeile die gesamte Partition summieren, anstatt schrittweise zu wachsen.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (ORDER BY sale_date) AS running_total
FROM sales
ORDER BY sale_date;

Warum ORDER BY einen Frame voraussetzt

Hier liegt das Detail, zu dem Interviewer gerne nachfragen: Wenn Sie ORDER BY zu einem Fensteraggregat hinzufügen, verwendet SQL den Standard-Frame RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

Genau dieser Standard-Frame erzeugt eine laufende Summe: jede Zeile vom Beginn der Partition bis einschließlich der aktuellen Zeile. Wenn Sie diesen Standard verstehen, wissen Sie auch, warum die kumulierte Summe „einfach funktioniert“.

Den Frame explizit angeben

Sie können den Frame auch von Hand angeben. Diese beiden Abfragen liefern dasselbe Ergebnis, aber die explizite Variante zeigt dem Interviewer, dass Sie verstehen, was im Hintergrund geschieht.

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ist die sicherste explizite Form für eine laufende Summe, weil sie physische Zeilen zählt und dadurch die Überraschungen bei der Wertgruppierung von RANGE vermeidet (dies wird in der nächsten Lektion behandelt).

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS running_total
FROM sales;

Beispiel: Tagesumsätze

Stellen Sie sich vier Verkaufstage vor: Mo. 100, Di. 50, Mi. 200, Do. 75. Die laufende Summe wächst von links nach rechts.

  • Mo.: 100
  • Di.: 100 + 50 = 150
  • Mi.: 150 + 200 = 350
  • Do.: 350 + 75 = 425

Die letzte Zeile entspricht immer der Gesamtsumme. Das ist eine schnelle Plausibilitätsprüfung, die Sie im Vorstellungsgespräch erwähnen können: Der letzte Wert der laufenden Summe muss SUM(amount) über die gesamte Datenmenge entsprechen.

Mit PARTITION BY pro Gruppe zurücksetzen

In realen Aufgaben wird normalerweise eine laufende Summe pro Kunde oder pro Region verlangt, nicht eine globale Gesamtsumme. Fügen Sie PARTITION BY hinzu, damit die Aufsummierung am Anfang jeder Partition neu beginnt.

Das mentale Modell: PARTITION BY teilt die Zeilen in unabhängige Gruppen auf, und ORDER BY sowie der Frame werden innerhalb jeder Gruppe separat ausgeführt.

SELECT
  customer_id,
  sale_date,
  amount,
  SUM(amount) OVER (
    PARTITION BY customer_id
    ORDER BY sale_date
  ) AS customer_running_total
FROM sales;

Die Falle bei gleichen Sortierwerten

Wenn zwei Zeilen denselben ORDER BY-Wert haben (etwa zwei Verkäufe am selben Datum), behandelt der Standard-Frame RANGE sie als Peers und gibt ihnen dieselbe laufende Summe, die beide Beträge einschließt.

Wenn Sie auch bei gleichen Werten eine strikt zeilenweise Erhöhung benötigen, wechseln Sie zu einem ROWS-Frame und fügen Sie dem ORDER BY einen eindeutigen Tiebreaker hinzu, zum Beispiel sale_date, id. Interviewer verwenden absichtlich doppelte Datumswerte, um zu sehen, ob Sie dies bemerken.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date, id
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS running_total
FROM sales;

Laufende Summe einer Anzahl

Kumulative Logik ist nicht auf SUM beschränkt. Jedes Aggregat kann als Fensterfunktion verwendet werden. Sie können also eine laufende Anzahl, einen laufenden Durchschnitt oder ein laufendes Maximum erstellen.

Eine laufende Anzahl von Bestellungen ist eine häufige Dashboard-Kennzahl: Wie viele Bestellungen haben wir bis zu einem bestimmten Tag bisher erhalten?

SELECT
  order_date,
  COUNT(*) OVER (
    ORDER BY order_date
  ) AS orders_to_date
FROM orders;

Die alte Methode: Korrelierte Unterabfrage

Manchmal bitten Interviewer Sie, eine laufende Summe ohne Fensterfunktionen zu lösen, um Ihr Verständnis zu prüfen. Die klassische Lösung aus der Zeit vor Fensterfunktionen ist eine korrelierte Unterabfrage, die jede vorherige Zeile erneut aufsummiert.

Das funktioniert, hat aber eine Komplexität von O(n²): Für jede Zeile wird die Tabelle erneut durchsucht. Erwähnen Sie dies, um zu zeigen, dass Sie wissen, warum Fensterfunktionen diese Methode abgelöst haben.

SELECT
  s.sale_date,
  s.amount,
  (SELECT SUM(s2.amount)
   FROM sales s2
   WHERE s2.sale_date <= s.sale_date) AS running_total
FROM sales s
ORDER BY s.sale_date;

Filterung und das Ergebnis der Fensterfunktion

Eine häufige Anschlussfrage lautet: „Zeigen Sie nur die Tage, an denen die laufende Summe 1000 überschritten hat.“ Sie können eine Fensterfunktion nicht in WHERE verwenden, weil der Frame erst berechnet wird, nachdem WHERE ausgeführt wurde.

Die Lösung besteht darin, die laufende Summe in einer CTE oder Unterabfrage zu berechnen und anschließend die äußere Abfrage zu filtern. Diese Verschachtelungsregel gilt für jede Fensterfunktion.

WITH t AS (
  SELECT
    sale_date,
    SUM(amount) OVER (ORDER BY sale_date) AS running_total
  FROM sales
)
SELECT *
FROM t
WHERE running_total >= 1000;

Wichtige Punkte im Vorstellungsgespräch

Wenn Sie eine Lösung für eine laufende Summe präsentieren, erläutern Sie die folgenden Punkte, um die volle Punktzahl zu erhalten:

  • SUM OVER (ORDER BY ...) ist die kumulative Variante.
  • Durch das Hinzufügen von ORDER BY entsteht ein Standard-Frame von UNBOUNDED PRECEDING bis CURRENT ROW.
  • Verwenden Sie PARTITION BY, um die Summe pro Gruppe zurückzusetzen.
  • Fügen Sie einen eindeutigen Tiebreaker und einen ROWS-Frame hinzu, um die Falle bei gleichen Werten zu vermeiden.
  • Verwenden Sie eine CTE, um nach dem Ergebnis zu filtern.

Kurzer Test

Testen Sie Ihr Verständnis des Standard-Frames.

Zusammenfassung: Kumulative Summen

Eine laufende Summe ist ein geordnetes Fensteraggregat. SUM(amount) OVER (ORDER BY sale_date) summiert die Zeilen vom Beginn der Partition bis zur aktuellen Zeile auf – dank des impliziten Frames von UNBOUNDED PRECEDING bis CURRENT ROW.

Setzen Sie die Summe mit PARTITION BY pro Gruppe zurück. Fügen Sie einen Tiebreaker und einen ROWS-Frame hinzu, um doppelte Sortierwerte zu behandeln, und verwenden Sie eine CTE, sobald Sie nach dem kumulierten Wert filtern müssen. Als Nächstes untersuchen wir den Unterschied zwischen ROWS und RANGE, auf den diese Lektion bereits hingewiesen hat.

Häufig gestellte Fragen

Ist die Lektion „Kumulative Summen mit Fensterrahmen“ kostenlos?

Ja — der vollständige Text von „Kumulative Summen mit Fensterrahmen“ 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 „Kumulative Summen mit Fensterrahmen“?

Mit SUM OVER und einem geordneten Fensterrahmen eine laufende Summe erstellen 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 „Kumulative Summen mit Fensterrahmen“?

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. Kumulative Summen mit Fensterrahmen
  2. Fensterrahmen mit ROWS oder RANGE
  3. Gleitende Mittelwerte über ein verschiebbares Fenster
  4. Kumulative Verteilung und Anteil an der Gesamtsumme
← Zurück zu SQL Interview Prep