Veränderungen von Periode zu Periode
Monatliches Wachstum und tägliche Differenzen mit LAG berechnen
Veränderungen von Periode zu Periode 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 unvermeidliche Analystenfrage
Wenn Sie sich für eine Stelle als Datenanalyst bewerben, rechnen Sie mit Fragen wie: „Berechnen Sie das monatliche Wachstum“ oder „Wie groß ist die Veränderung von Tag zu Tag?“ Das ist nahezu unvermeidbar.
Die Grundlage ist LAG: Rufen Sie den Wert der vorherigen Periode ab und berechnen Sie anschließend eine absolute Differenz oder eine prozentuale Veränderung. In dieser Lektion lernen Sie die Periodenvergleichsmuster mit LAG, nach denen Interviewer Ihre Lösung bewerten.
Absolute Änderung mit LAG
Die einfachste Variante ist die reine Differenz zwischen dieser und der letzten Periode. Rufen Sie den vorherigen Wert mit LAG ab und subtrahieren Sie ihn direkt in der Abfrage.
Die erste geordnete Zeile hat keinen Vorgänger, daher ist ihre Änderung NULL. Das ist korrekt und kein Fehler: Es gibt tatsächlich keine vorherige Periode, mit der sie verglichen werden könnte.
SELECT
month,
revenue,
revenue - LAG(revenue) OVER (ORDER BY month) AS mom_change
FROM monthly_sales
ORDER BY month;Prozentuale Änderung
In Interviews wird normalerweise Wachstum als Prozentsatz erwartet. Die Formel lautet (aktuell - vorherig) / vorherig, multipliziert mit 100. Setzen Sie sie direkt mit LAG um.
Achten Sie auf die Reihenfolge der Berechnungen und die Klammern; eine falsch gesetzte Klammer ist unter Zeitdruck ein klassischer Fehler.
SELECT
month,
revenue,
100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
/ LAG(revenue) OVER (ORDER BY month) AS pct_growth
FROM monthly_sales
ORDER BY month;Ganzzahldivision vermeiden
Eine Falle, in die viele Kandidaten tappen: Wenn revenue eine Ganzzahl ist, ergibt (110 - 100) / 100 in Datenbanken mit Ganzzahldivision den Wert 0.
Multiplizieren Sie zuerst mit 100.0 (einem Gleitkomma-Literal) oder wandeln Sie den Wert mit CAST in eine Dezimalzahl um, um Gleitkommaarithmetik zu erzwingen. Wenn Sie dies von sich aus erwähnen, zeigen Sie Ihre Aufmerksamkeit für Details.
SELECT
month,
ROUND(
100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
/ LAG(revenue) OVER (ORDER BY month), 2
) AS pct_growth
FROM monthly_sales;Sauberer: Einmalig in einer CTE berechnen
LAG zweimal aufzurufen (für Zähler und Nenner) ist repetitiv und leicht falsch zu schreiben. Eine häufige Überarbeitung besteht darin, den vorherigen Wert einmal in einer CTE zu berechnen und anschließend die Arithmetik in der äußeren Abfrage durchzuführen.
Das ist in einem Whiteboard-Interview besser lesbar und verhindert, dass die beiden LAG-Aufrufe voneinander abweichen.
WITH t AS (
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev
FROM monthly_sales
)
SELECT
month,
revenue,
ROUND(100.0 * (revenue - prev) / prev, 2) AS pct_growth
FROM t;Division durch null verhindern
Wenn der Wert der vorherigen Periode 0 sein kann, teilt die Prozentformel durch null und erzeugt einen Fehler. Verwenden Sie NULLIF(prev, 0), damit der Nenner zu NULL wird und das Ergebnis ebenfalls NULL statt einer Ausnahme ist.
Eine defensive Division ist ein kleines Detail, das Interviewer bei Kandidaten mit Blick auf produktionsreife Lösungen bemerken.
SELECT
month,
revenue,
100.0 * (revenue - prev) / NULLIF(prev, 0) AS pct_growth
FROM (
SELECT month, revenue,
LAG(revenue) OVER (ORDER BY month) AS prev
FROM monthly_sales
) s;Periodenvergleich pro Gruppe
Die meisten Fragen beziehen sich auf einen bestimmten Bereich: etwa monatliches Wachstum pro Produkt oder pro Region. Fügen Sie PARTITION BY hinzu, damit die Zeitreihe jeder Gruppe nur mit sich selbst verglichen wird.
Der jeweils früheste Monat jeder Gruppe wird auf NULL zurückgesetzt und niemals über Produktgrenzen hinweg verglichen.
SELECT
product_id,
month,
revenue,
revenue - LAG(revenue) OVER (
PARTITION BY product_id
ORDER BY month
) AS mom_change
FROM product_sales;Vorjahresvergleich mit Offset
Bei einem Vorjahresvergleich mit Monatsdaten, bei denen die Zeilen jeweils einen Monat auseinanderliegen, vergleichen Sie den Wert mit dem Wert 12 Zeilen zuvor. Das Offset-Argument erledigt dies direkt: LAG(revenue, 12).
Dies setzt eine Zeile pro Monat ohne Lücken voraus. Wenn Monate fehlen können, würden Sie stattdessen über ein explizites Datum verknüpfen – ein wichtiges Detail, das Sie erwähnen sollten.
SELECT
month,
revenue,
revenue - LAG(revenue, 12) OVER (ORDER BY month) AS yoy_change
FROM monthly_sales
ORDER BY month;Vor dem Vergleich voraggregieren
Rohdatentabellen mit Ereignissen sind nicht nach Monat voraggregiert. Eine realistische Lösung aggregiert zunächst auf eine Zeile pro Periode und wendet anschließend LAG auf das aggregierte Ergebnis an, normalerweise über eine CTE.
Wenn Sie LAG auf nicht aggregierte Zeilen anwenden, vergleichen Sie einzelne Transaktionen statt Monatssummen – ein häufiger logischer Fehler.
WITH monthly AS (
SELECT DATE_TRUNC('month', order_date) AS mth,
SUM(amount) AS revenue
FROM orders
GROUP BY 1
)
SELECT mth, revenue,
revenue - LAG(revenue) OVER (ORDER BY mth) AS mom_change
FROM monthly
ORDER BY mth;Das erste NULL interpretieren
Interviewer fragen manchmal: „Warum ist das Wachstum in Ihrer ersten Zeile NULL, und ist das akzeptabel?“ Die richtige Antwort lautet: Es gibt keine vorherige Periode, daher ist die Änderung nicht definiert, und NULL stellt dies korrekt dar.
Wenn das Unternehmen stattdessen 0 wünscht, würden Sie LAG(revenue, 1, 0) oder COALESCE verwenden – aber nur, wenn dies der beabsichtigten Bedeutung entspricht.
Wachstumsrichtung kennzeichnen
Interviewer erweitern die Frage manchmal: „Kennzeichnen Sie außerdem, ob jeder Monat gewachsen, geschrumpft oder unverändert geblieben ist.“ Umschließen Sie den LAG-Vergleich mit einem CASE-Ausdruck.
Der Vergleich mit dem vorherigen Wert liefert zusätzlich zur numerischen Differenz eine klare, verständliche Trendspalte und zeigt für die erste Periode ohne Vergleich problemlos NULL oder ein Standardlabel an.
SELECT
month,
revenue,
CASE
WHEN revenue > LAG(revenue) OVER (ORDER BY month) THEN 'up'
WHEN revenue < LAG(revenue) OVER (ORDER BY month) THEN 'down'
ELSE 'flat'
END AS trend
FROM monthly_sales
ORDER BY month;Kurzer Test
Erkennen Sie den häufigen Fehler in Abfragen zur prozentualen Änderung.
Zusammenfassung
Die Veränderung im Periodenvergleich besteht aus LAG plus Arithmetik:
- Absolute Änderung:
value - LAG(value) OVER (ORDER BY period). - Prozentuale Änderung:
100.0 * (value - prev) / NULLIF(prev, 0). - Erzwingen Sie Gleitkommaarithmetik, verhindern Sie die Division durch null und aggregieren Sie vorab auf eine Zeile pro Periode.
- Schränken Sie den Vergleich mit
PARTITION BYauf Gruppen ein und verwenden Sie für den Vorjahresvergleich das Offset.
Als Nächstes: Zeilen mit NTILE in Buckets und Stufen aufteilen.
Häufig gestellte Fragen
Ist die Lektion „Veränderungen von Periode zu Periode“ kostenlos?
Ja — der vollständige Text von „Veränderungen von Periode zu Periode“ 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 „Veränderungen von Periode zu Periode“?
Monatliches Wachstum und tägliche Differenzen mit LAG berechnen 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 „Veränderungen von Periode zu Periode“?
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
- LAG und LEAD für benachbarte Zeilen
- Veränderungen von Periode zu Periode
- Mit NTILE Daten in Gruppen einteilen
- FIRST_VALUE, LAST_VALUE und Fenstergrenzen