LAG und LEAD für benachbarte Zeilen
Auf Werte der vorherigen und nächsten Zeile zugreifen, ohne einen SELF JOIN zu verwenden
LAG und LEAD für benachbarte Zeilen 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, die Interviewer stellen
Eine der häufigsten Fragen in Vorstellungsgesprächen für Analysten lautet: „Vergleichen Sie jede Zeile mit der vorherigen, ohne einen Self-Join zu verwenden.“ Denken Sie an den Umsatzvergleich von Monat zu Monat, den vorherigen Login eines Benutzers oder das nächste Ereignis in einer Sequenz.
Die klare Antwort sind die Fensterfunktionen LAG und LEAD. Sie ermöglichen es einer Zeile, den Wert einer benachbarten Zeile einzusehen, während alle Detailzeilen erhalten bleiben. In dieser Lektion entwickeln Sie ein präzises Verständnis dafür, wie diese Funktionen durch benachbarte Zeilen navigieren.
Was LAG und LEAD tun
LAG(col) gibt den Wert von col aus der vorherigen Zeile zurück. LEAD(col) gibt den Wert aus der nächsten Zeile zurück. „Vorherig“ und „nächste“ werden vollständig durch ORDER BY innerhalb der OVER-Klausel bestimmt.
- LAG blickt zurück.
- LEAD blickt nach vorn.
Beide sind Fensterfunktionen mit Offset: Sie fassen Zeilen niemals zusammen, sondern fügen der aktuellen Zeile lediglich den Wert einer benachbarten Zeile hinzu.
Grundlegende LAG-Syntax
Hier sehen Sie das typische Grundmuster. Wir haben eine Tabelle sales mit den Spalten month und revenue. Jede Zeile soll zusätzlich den Umsatz des vorherigen Monats anzeigen.
OVER (ORDER BY month) teilt der Engine mit, wie „vorherig“ definiert wird. Die erste Zeile hat keinen Vorgänger, daher ist prev_revenue dort NULL.
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;Das Ergebnis lesen
Für die Daten 2024-01 = 100, 2024-02 = 130, 2024-03 = 120 gibt die Abfrage Folgendes zurück:
- Jan: Umsatz 100, prev_revenue NULL
- Feb: Umsatz 130, prev_revenue 100
- Mrz: Umsatz 120, prev_revenue 130
Jede Zeile hat den Wert der direkt darüberstehenden Zeile aus der sortierten Ergebnismenge übernommen. Kein Self-Join, keine Unterabfrage, kein Verlust von Zeilen.
LEAD blickt nach vorn
LEAD ist das Gegenstück zu LAG. Verwenden Sie es, wenn eine Zeile wissen muss, was als Nächstes kommt, zum Beispiel das Datum des nächsten Kaufs, um die Zeit zwischen Bestellungen zu berechnen.
Die letzte Zeile der sortierten Ergebnismenge hat keinen Nachfolger, daher ist ihr LEAD-Ergebnis NULL.
SELECT
month,
revenue,
LEAD(revenue) OVER (ORDER BY month) AS next_revenue
FROM sales
ORDER BY month;Das Offset-Argument
Beide Funktionen akzeptieren ein optionales zweites Argument: die Anzahl der zu überspringenden Zeilen. LAG(col, 2) geht zwei Zeilen zurück, LEAD(col, 3) springt drei Zeilen nach vorn.
Interviewer nutzen dies, um beispielsweise nach dem „Umsatz vor zwei Monaten“ oder dem „Wert drei Zeilen weiter unten“ zu fragen. Der Standard-Offset ist 1.
SELECT
month,
revenue,
LAG(revenue, 2) OVER (ORDER BY month) AS revenue_2_months_ago
FROM sales
ORDER BY month;Das Argument für den Standardwert
Ein drittes Argument liefert einen Ersatzwert, wenn es keine benachbarte Zeile gibt, anstatt NULL zurückzugeben. Die Signatur lautet LAG(col, offset, default).
Das ist nützlich, wenn eine nachgelagerte Berechnung NULL nicht verarbeiten kann. Beispielsweise können Sie den fehlenden vorherigen Wert als 0 behandeln, damit eine Differenz weiterhin berechnet wird.
SELECT
month,
revenue,
LAG(revenue, 1, 0) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;PARTITION BY setzt das Fenster zurück
In realen Daten gibt es selten nur eine globale Sequenz. Meist vergleichen Sie Werte innerhalb jedes Kunden, Produkts oder jeder Region. PARTITION BY setzt die LAG-/LEAD-Berechnung am Anfang jeder Partition zurück.
Das bedeutet, dass die erste Zeile jeder Partition von LAG den Wert NULL erhält. Es wird niemals ein Wert über die Grenze hinweg aus den Daten eines anderen Kunden übernommen.
SELECT
customer_id,
order_date,
amount,
LAG(amount) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS prev_amount
FROM orders;Praxisbeispiel: Tage zwischen Bestellungen
Eine häufige Aufgabe besteht darin, den Abstand zwischen den aufeinanderfolgenden Bestellungen eines Kunden zu messen. Rufen Sie das Datum der vorherigen Bestellung mit LAG ab und subtrahieren Sie es anschließend.
Bei der ersten Bestellung jedes Kunden ergibt sich NULL, da kein vorheriges Datum zum Subtrahieren vorhanden ist. Genau solche Vergleiche pro Kunde sollen Interviewer mit Fensterfunktionen gelöst sehen.
SELECT
customer_id,
order_date,
order_date - LAG(order_date) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS days_since_prev
FROM orders;Warum kein Self-Join
Die Lösung vor den Fensterfunktionen war ein korrelierter Self-Join: Die Tabelle wurde mit sich selbst über die Bedingung verknüpft, dass es sich um „die Zeile mit dem größten Datum unterhalb dieses Datums“ handelt. Das funktioniert, ist aber umständlich, bei Gleichständen fehleranfällig und oft langsamer.
LAG/LEADbringen die Absicht in einer Zeile zum Ausdruck.- Sie werden in einem einzigen geordneten Durchlauf ausgewertet.
- Gleichstände werden durch Ihr
ORDER BYdeterministisch aufgelöst.
Wenn Sie sagen „Ich würde LAG statt eines Self-Joins verwenden“, zeigen Sie Ihre Sicherheit im Umgang mit SQL.
Häufiger Fehler: Fehlendes ORDER BY
Ohne ein ORDER BY in der OVER-Klausel ist die „vorherige Zeile“ nicht definiert. Manche Datenbanksysteme lehnen dies ab, andere liefern unvorhersehbare Ergebnisse. Ordnen Sie das Fenster immer.
Beachten Sie außerdem, dass die Sortierung innerhalb von OVER unabhängig vom äußeren ORDER BY der Abfrage ist. Das Fenster bestimmt, welche Zeile der Nachbar ist; die äußere Klausel legt lediglich die Anzeigereihenfolge fest.
Kurzer Test
Testen Sie Ihr Verständnis von Offset-Fensterfunktionen.
Zusammenfassung
Sie kennen nun die Offset-Fensterfunktionen:
LAG(col)liest die vorherige Zeile,LEAD(col)die nächste, festgelegt durch dasORDER BYdes Fensters.- Optionale Argumente:
LAG(col, offset, default). PARTITION BYsetzt die Navigation für jede Gruppe zurück, sodass die GrenzzeilenNULLsind.- Sie ersetzen umständliche Self-Joins zum Vergleichen benachbarter Zeilen.
Als Nächstes wenden wir das auf die unvermeidliche Frage im Analysteninterview an: den Periodenvergleich.
Häufig gestellte Fragen
Ist die Lektion „LAG und LEAD für benachbarte Zeilen“ kostenlos?
Ja — der vollständige Text von „LAG und LEAD für benachbarte Zeilen“ 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 „LAG und LEAD für benachbarte Zeilen“?
Auf Werte der vorherigen und nächsten Zeile zugreifen, ohne einen SELF JOIN zu verwenden 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 „LAG und LEAD für benachbarte Zeilen“?
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
- 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