0Pricing
SQL Interview Prep · Lektion

Fensterrahmen mit ROWS oder RANGE

Den subtilen und häufig geprüften Unterschied zwischen zeilen- und wertbasierten Rahmen verstehen

Fensterrahmen mit ROWS oder RANGE 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.

Der Unterschied, nach dem Interviewer fragen

Sobald Sie eine laufende Summe schreiben können, folgt natürlich die Frage: „Was ist der Unterschied zwischen ROWS und RANGE in einem Fenster-Frame?“ Das ist ein präzises Signal für Kenntnisse auf mittlerem Niveau. Viele Kandidaten verwenden Frames täglich, ohne jemals zu bemerken, dass sich die beiden Schlüsselwörter unterschiedlich verhalten.

Beide definieren die Menge der Zeilen, die das Aggregat sieht, aber sie bestimmen diese Menge auf grundlegend unterschiedliche Weise. Wenn Sie das richtig erklären, heben Sie sich ab.

ROWS zählt physische Zeilen

ROWS ist positionsbezogen. ROWS BETWEEN 2 PRECEDING AND CURRENT ROW bedeutet wörtlich: die aktuelle Zeile plus die beiden direkt darüberliegenden physischen Zeilen in der sortierten Reihenfolge.

Es spielt keine Rolle, ob benachbarte Zeilen denselben ORDER BY-Wert haben. Drei Zeilen sind drei Zeilen, ohne Ausnahme. Diesen Frame benötigen Sie fast immer für gleitende Durchschnitte und strikt laufende Summen.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  ) AS rows_sum
FROM sales;

RANGE zählt nach Wert

RANGE ist wertbasiert. Es umfasst jede Zeile, deren ORDER BY-Wert innerhalb eines logischen Bereichs um den Wert der aktuellen Zeile liegt, nicht eine bestimmte Anzahl von Zeilen.

Die wichtigste Folge: Bei RANGE werden alle Zeilen mit demselben ORDER BY-Wert als eine Gruppe gleichrangiger Zeilen behandelt. Sie erhalten alle denselben Frame und somit dasselbe Ergebnis.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS range_sum
FROM sales;

Das Beispiel mit gleichen Werten, das den Unterschied zeigt

Angenommen, zwei Verkäufe finden am 2024-03-02 statt und haben die Beträge 30 und 40. Ihnen geht der 2024-03-01 mit dem Betrag 100 voraus.

  • Mit RANGE bis CURRENT ROW: Beide Zeilen vom 03-02 sind gleichrangig, daher zeigen beide 100 + 30 + 40 = 170.
  • Mit ROWS bis CURRENT ROW: Die erste Zeile vom 03-02 zeigt 130, die zweite 170, weil jede Zeile den Frame jeweils um eine Position erweitert.

Dieselben Daten, andere Zahlen. Diese Abweichung bei gleichen Werten ist der Kern der Frage.

Warum der Standard RANGE ist

Denken Sie daran: OVER (ORDER BY ...) verwendet ohne expliziten Frame standardmäßig RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

Das bedeutet, dass eine einfache laufende Summe stillschweigend RANGE verwendet. Bei eindeutigen Sortierschlüsseln ist das identisch zu ROWS, sodass der Fehler verborgen bleibt. Sobald doppelte Sortierwerte auftreten, fasst Ihre laufende Summe gleichrangige Zeilen stillschweigend zusammen. Deshalb geben erfahrene Entwickler ROWS explizit an.

RANGE mit numerischen Offsets

RANGE kann einen Wert-Offset verwenden, nicht nur UNBOUNDED. RANGE BETWEEN 7 PRECEDING AND CURRENT ROW über einer Datums- oder numerischen Spalte schließt jede Zeile ein, deren Wert innerhalb von 7 Einheiten vom aktuellen Wert liegt.

Bei einem Datum ergibt das ein echtes Fenster der „letzten 7 Tage“, das fehlende Tage korrekt überspringt, während ROWS 7 PRECEDING unabhängig von Lücken die vorherigen 7 Zeilen erfasst. Dieses Detail zu kennen, ist eine überzeugende Antwort.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    RANGE BETWEEN INTERVAL '7 days' PRECEDING AND CURRENT ROW
  ) AS last_7_days
FROM sales;

ROWS ignoriert Lücken

Die Kehrseite: ROWS kennt die Lücken in den Daten nicht. Wenn in Ihrer Verkaufstabelle die Wochenenden fehlen, erstreckt sich ROWS BETWEEN 6 PRECEDING AND CURRENT ROW über 7 aufgezeichnete Tage, die tatsächlich zwei Kalenderwochen umfassen können.

Die Wahl hängt also von der Absicht ab: letzte N Datensätze bedeutet ROWS; letzte N Werteinheiten (Tage, Dollar) bedeutet RANGE mit einem Offset.

Realitätscheck zur Dialektunterstützung

Eine ehrliche Antwort im Vorstellungsgespräch weist auf Unterschiede bei der Unterstützung hin:

  • PostgreSQL unterstützt RANGE mit Offsets (seit v11) sowie ROWS vollständig.
  • SQL Server unterstützt ROWS und RANGE, aber RANGE nur mit UNBOUNDED/CURRENT ROW, nicht mit numerischen Offsets.
  • MySQL 8 unterstützt beide Varianten, jedoch nur bestimmte Offset-Typen für RANGE.

Wenn ein numerischer RANGE-Offset nicht verfügbar ist, bilden Sie ihn mit einem Self-Join oder einem generierten Kalender nach. Das zu erwähnen, zeigt Ihr Bewusstsein für die Anforderungen der Produktionspraxis.

GROUPS: Der dritte Modus

Es gibt einen weniger bekannten dritten Frame-Modus: GROUPS. Er zählt Peer-Gruppen statt Zeilen oder Werte. GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW schließt die aktuelle Peer-Gruppe und die unmittelbar davorliegende ein.

Er wird nur selten benötigt, aber wenn Sie auf die Frage „Gibt es weitere Frame-Modi?“ auch diesen nennen, beweisen Sie echtes Tiefenwissen. Unterstützung gibt es in PostgreSQL 11+ und einigen weiteren Systemen.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
  ) AS two_day_groups
FROM sales;

Eine Entscheidungsregel zum Aufsagen

Fassen Sie das gesamte Thema in einem Satz zusammen, den Sie im Vorstellungsgespräch sagen können:

„Verwenden Sie ROWS, wenn Sie eine feste Anzahl physischer Zeilen meinen, RANGE, wenn Sie einen logischen Bereich des Sortierwerts meinen, und denken Sie daran, dass Gleichstände zu unterschiedlichen Ergebnissen führen, weil die standardmäßige RANGE gleichartige Werte zusammenfasst.“

Dieser eine Satz beantwortet die Frage vollständig und souverän.

Direktvergleich

Wenn Sie beide Frame-Varianten in einer Abfrage verwenden, wird der Unterschied sichtbar. Führen Sie diese Abfrage mit Daten aus, die doppelte Datumswerte enthalten, und vergleichen Sie die beiden Spalten Zeile für Zeile.

Bei eindeutigen Datumswerten stimmen die Spalten exakt überein; bei gleichen Datumswerten wiederholt die RANGE-Spalte für alle Peers dieselbe Summe, während die ROWS-Spalte Schritt für Schritt ansteigt.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (ORDER BY sale_date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rows_total,
  SUM(amount) OVER (ORDER BY sale_date
    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS range_total
FROM sales;

Kurzer Test

Zwei Zeilen haben bei einem standardmäßigen Frame denselben ORDER-BY-Wert. Was passiert?

Zusammenfassung: ROWS vs RANGE

ROWS zählt physische Zeilen; RANGE zählt anhand des logischen Werts der Sortierspalte und fasst Gleichstände als Peers zusammen. Der standardmäßige Frame von OVER (ORDER BY ...) ist RANGE. Deshalb kann eine naive laufende Summe doppelte Sortierwerte zu einer gemeinsamen Summe zusammenfassen.

Wählen Sie ROWS für „letzte N Datensätze“ und gleitende Fenster, die unempfindlich gegenüber Lücken sind; wählen Sie RANGE mit einem Offset für „letzte N Tage/Dollar“, wenn Lücken berücksichtigt werden sollen. Zu wissen, dass GROUPS existiert, ist ein Bonus. Als Nächstes verwenden wir ROWS-Frames, um gleitende Durchschnitte zu bilden.

Häufig gestellte Fragen

Ist die Lektion „Fensterrahmen mit ROWS oder RANGE“ kostenlos?

Ja — der vollständige Text von „Fensterrahmen mit ROWS oder RANGE“ 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 „Fensterrahmen mit ROWS oder RANGE“?

Den subtilen und häufig geprüften Unterschied zwischen zeilen- und wertbasierten Rahmen 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 2 von 4.

Wie lange dauert die Lektion „Fensterrahmen mit ROWS oder RANGE“?

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. Kumulative Summen mit Fensterrahmen
  2. Fensterrahmen mit ROWS oder RANGE
  3. Gleitende Mittelwerte über ein verschiebbares Fenster
  4. Kumulative Verteilung und Anteil an der Gesamtsumme
← Zurück zu SQL Interview Prep