0Pricing
SQL Interview Prep · Lektion

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 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, 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/LEAD bringen die Absicht in einer Zeile zum Ausdruck.
  • Sie werden in einem einzigen geordneten Durchlauf ausgewertet.
  • Gleichstände werden durch Ihr ORDER BY deterministisch 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 das ORDER BY des Fensters.
  • Optionale Argumente: LAG(col, offset, default).
  • PARTITION BY setzt die Navigation für jede Gruppe zurück, sodass die Grenzzeilen NULL sind.
  • 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 SQL Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL 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 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 „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 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. LAG und LEAD für benachbarte Zeilen
  2. Veränderungen von Periode zu Periode
  3. Mit NTILE Daten in Gruppen einteilen
  4. FIRST_VALUE, LAST_VALUE und Fenstergrenzen
← Zurück zu SQL Interview Prep