Kumulative Summen mit Fensterrahmen
Mit SUM OVER und einem geordneten Fensterrahmen eine laufende Summe erstellen
Kumulative Summen mit Fensterrahmen ist eine kostenlose Coding 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 Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding 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 BYentsteht ein Standard-Frame vonUNBOUNDED PRECEDINGbisCURRENT 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 Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding 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 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 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 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
- Kumulative Summen mit Fensterrahmen
- Fensterrahmen mit ROWS oder RANGE
- Gleitende Mittelwerte über ein verschiebbares Fenster
- Kumulative Verteilung und Anteil an der Gesamtsumme