0Pricing
SQL Interview Prep · Lektion

FIRST_VALUE, LAST_VALUE und Fenstergrenzen

Grenzwerte abrufen und den Fallstrick bei LAST_VALUE verstehen

FIRST_VALUE, LAST_VALUE und Fenstergrenzen ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 4 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.

Grenzwerte abrufen

Interviewer fragen: „Zeigen Sie jede Zeile zusammen mit dem ersten und letzten Wert ihrer Gruppe.“ Denken Sie etwa an das Datum des ersten Logins pro Benutzer oder an den aktuellsten Preis in einer Partition neben jeder Detailzeile.

Die Funktionen heißen FIRST_VALUE und LAST_VALUE. Sie wirken einfach, aber LAST_VALUE verbirgt einen der bekanntesten Fallstricke bei Fensterrahmen in SQL. In dieser Lektion lernen Sie, beide Funktionen zuverlässig einzusetzen.

Grundlagen zu FIRST_VALUE

FIRST_VALUE(col) gibt für jede Zeile den Wert von col aus der ersten Zeile des Fensters zurück. Nach Datum sortiert erhält jede Zeile den frühesten Wert ihrer Partition.

Da der Standardrahmen bei der ersten Zeile der Partition beginnt, verhält sich FIRST_VALUE normalerweise genau so, wie man es erwartet.

SELECT
  user_id,
  login_date,
  FIRST_VALUE(login_date) OVER (
    PARTITION BY user_id
    ORDER BY login_date
  ) AS first_login
FROM logins;

Der Standard-Frame des Fensters

Hier liegt der entscheidende Punkt. Wenn Sie ORDER BY zu einem Fenster hinzufügen, lautet der Standard-Frame RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

Das bedeutet, dass das Fenster für jede Zeile nur vom Beginn der Partition bis zur aktuellen Zeile reicht, nicht bis zum Ende. FIRST_VALUE bleibt davon unberührt (die erste Zeile liegt immer im Bereich), aber LAST_VALUE ist davon stark betroffen.

Die LAST_VALUE-Falle

Wenn Sie LAST_VALUE nur mit einem ORDER BY ausführen, erwarten die meisten Kandidaten den letzten Wert der Partition. Da der Frame jedoch an der aktuellen Zeile endet, ist der „letzte Wert im Frame“ stattdessen einfach der Wert der aktuellen Zeile selbst.

Diese Abfrage gibt daher in jeder Zeile login_date selbst zurück, was fehlerhaft aussieht. Das ist der mit Abstand häufigste Stolperstein bei Fensterfunktionen.

SELECT
  user_id,
  login_date,
  LAST_VALUE(login_date) OVER (
    PARTITION BY user_id
    ORDER BY login_date
  ) AS wrong_last_login
FROM logins;

LAST_VALUE mit einem vollständigen Frame korrigieren

Die Lösung besteht darin, den Frame auf die gesamte Partition zu erweitern: ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

Jetzt erstreckt sich das Fenster für jede Zeile über die gesamte Partition, sodass LAST_VALUE tatsächlich den letzten Wert zurückgibt. Nennen Sie diese Korrektur im Vorstellungsgespräch ausdrücklich; sie zeigt, dass Sie Frames verstehen und nicht nur Funktionsnamen kennen.

SELECT
  user_id,
  login_date,
  LAST_VALUE(login_date) OVER (
    PARTITION BY user_id
    ORDER BY login_date
    ROWS BETWEEN UNBOUNDED PRECEDING
             AND UNBOUNDED FOLLOWING
  ) AS last_login
FROM logins;

Eine einfachere Alternative

Viele Entwickler umgehen den Frame vollständig: Um den letzten Wert zu erhalten, verwenden Sie FIRST_VALUE mit einer umgekehrten Sortierreihenfolge.

FIRST_VALUE(login_date) OVER (... ORDER BY login_date DESC) gibt das aktuellste Datum zurück, ohne dass eine Frame-Klausel erforderlich ist. Das ist ein eleganter und leicht zu merkender Trick, den Sie erwähnen können.

SELECT
  user_id,
  login_date,
  FIRST_VALUE(login_date) OVER (
    PARTITION BY user_id
    ORDER BY login_date DESC
  ) AS last_login
FROM logins;

ROWS vs. RANGE in Frames

Frames gibt es in zwei Varianten. ROWS zählt physische Zeilen, während RANGE Zeilen mit gleichen ORDER BY-Werten gruppiert (Peers).

Der Standard-Frame verwendet RANGE. Deshalb teilen sich Zeilen mit gleichen Sortierwerten dieselbe Frame-Grenze. Für Korrekturen an LAST_VALUE sollten Sie den expliziten Frame ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING bevorzugen, um Überraschungen bei gleichen Werten zu vermeiden.

NTH_VALUE für beliebige Positionen

Über den ersten und letzten Wert hinaus ruft NTH_VALUE(col, n) den Wert an Position n innerhalb des Frames ab, zum Beispiel den zweithöchsten Preis.

Die Funktion folgt denselben Frame-Regeln wie LAST_VALUE. Verwenden Sie daher einen vollständigen Frame, wenn Sie den n-ten Wert der gesamten Partition und nicht nur den Wert bis zur aktuellen Zeile benötigen.

SELECT
  product_id,
  price,
  NTH_VALUE(price, 2) OVER (
    PARTITION BY product_id
    ORDER BY price DESC
    ROWS BETWEEN UNBOUNDED PRECEDING
             AND UNBOUNDED FOLLOWING
  ) AS second_highest_price
FROM prices;

Beispiel: Erster und letzter Wert zusammen

Ein häufiger Bericht zeigt jede Transaktion zusammen mit dem Betrag der ersten und der letzten Transaktion des Kunden. Kombinieren Sie beide Funktionen und denken Sie an den expliziten Frame für LAST_VALUE.

Nun enthält jede Zeile den ersten und letzten Wert der vollständigen Partition – bereit für die Berechnung einer Differenz oder eine Kennzeichnung.

SELECT
  customer_id,
  txn_date,
  amount,
  FIRST_VALUE(amount) OVER w AS first_amt,
  LAST_VALUE(amount) OVER w AS last_amt
FROM transactions
WINDOW w AS (
  PARTITION BY customer_id
  ORDER BY txn_date
  ROWS BETWEEN UNBOUNDED PRECEDING
           AND UNBOUNDED FOLLOWING
);

Benannte Fenster halten es DRY

Beachten Sie, dass die vorherige Abfrage eine WINDOW w AS (...)-Klausel verwendet und zweimal auf OVER w verweist. Wenn Sie das Fenster einmal definieren, müssen Sie eine lange Frame-Spezifikation nicht wiederholen und verhindern, dass sich die beiden Funktionen voneinander entfernen.

Die meisten großen Datenbanken unterstützen benannte Fenster. Ihre Verwendung ist eine saubere Lösung, die Interviewer schätzen, wenn mehrere Spalten dasselbe Fenster verwenden.

Beispiel: Differenz vom ersten zum letzten Wert

Eine häufige Anschlussfrage betrifft die Veränderung zwischen der ersten und der letzten Transaktion eines Kunden. Wenn beide Grenzwerte in jeder Zeile vorhanden sind, subtrahieren Sie sie und reduzieren das Ergebnis bei Bedarf auf eine Zeile pro Kunde.

Hier kombinieren Sie die Korrektur für den vollständigen Frame mit einfacher Arithmetik – genau die Art sauber zusammengesetzter End-to-End-Antwort, die Interviewer sehen möchten.

SELECT DISTINCT
  customer_id,
  LAST_VALUE(amount) OVER w - FIRST_VALUE(amount) OVER w AS first_to_last_delta
FROM transactions
WINDOW w AS (
  PARTITION BY customer_id
  ORDER BY txn_date
  ROWS BETWEEN UNBOUNDED PRECEDING
           AND UNBOUNDED FOLLOWING
);

Kurzer Test

Der klassische LAST_VALUE-Stolperstein.

Zusammenfassung

Grenzwertfunktionen hängen vom Frame ab:

  • FIRST_VALUE funktioniert mit dem Standard-Frame, LAST_VALUE dagegen nicht.
  • Der Standard-Frame endet an der aktuellen Zeile. Korrigieren Sie LAST_VALUE mit ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING oder kehren Sie die Sortierreihenfolge um und verwenden Sie FIRST_VALUE.
  • NTH_VALUE(col, n) ruft beliebige Positionen ab; benannte Fenster halten Spezifikationen für mehrere Spalten DRY.

Damit ist das Werkzeugset aus LAG, LEAD, NTILE und Grenzwertfunktionen vollständig.

Häufig gestellte Fragen

Ist die Lektion „FIRST_VALUE, LAST_VALUE und Fenstergrenzen“ kostenlos?

Ja — der vollständige Text von „FIRST_VALUE, LAST_VALUE und Fenstergrenzen“ 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 „FIRST_VALUE, LAST_VALUE und Fenstergrenzen“?

Grenzwerte abrufen und den Fallstrick bei LAST_VALUE verstehen 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 4 von 4.

Wie lange dauert die Lektion „FIRST_VALUE, LAST_VALUE und Fenstergrenzen“?

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