0Pricing
SQL Interview Prep · Lektion

N aufeinanderfolgende Zeilen mit erfüllter Bedingung

Das klassische Zeitfenstermuster „drei aufeinanderfolgende Tage mit Umsätzen über X“.

N aufeinanderfolgende Zeilen mit erfüllter Bedingung ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 3 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.

Ein LeetCode-Klassiker

Dies ist eine der am häufigsten gestellten SQL-Fragen in Vorstellungsgesprächen: „Finden Sie alle Daten mit mindestens drei aufeinanderfolgenden Tagen, an denen der Umsatz einen Schwellenwert überschritten hat“ oder der LeetCode-Klassiker „Melden Sie das Stadion mit mindestens drei aufeinanderfolgenden Zeilen, in denen die Besucherzahl über 100 liegt.“

Das Muster ist immer gleich: Eine Zeile zählt nur dann, wenn sie Teil einer Folge von N aufeinanderfolgenden passenden Zeilen ist. In dieser Lektion lernen Sie zwei saubere Lösungen sowie die Falle kennen, in die die meisten Kandidaten geraten.

Die Beispieldaten

Wir verwenden eine tägliche sales-Tabelle. Die Bedingung lautet amount > 100. Wir müssen jeden Tag zurückgeben, der zu einer Folge von mindestens 3 aufeinanderfolgenden Kalendertagen gehört, an denen die Bedingung erfüllt ist.

  • sale_date — eine Zeile pro Tag
  • amount — der Gesamtumsatz an diesem Tag

Wichtige Feinheit: Die Zeilen müssen in der Reihenfolge aufeinanderfolgen und bei datumsbasierten Varianten auch im Kalender.

SELECT * FROM sales ORDER BY sale_date;
-- sale_date  | amount
-- 2024-03-01 |  120
-- 2024-03-02 |  150
-- 2024-03-03 |  130
-- 2024-03-04 |   90
-- 2024-03-05 |  200

Ansatz 1: Filtern, dann Inseln bilden

Der robuste Ansatz: Behalten Sie zunächst nur die passenden Zeilen, gruppieren Sie die verbleibenden Zeilen anschließend zu aufeinanderfolgenden Inseln und behalten Sie dann nur Inseln mit einer Länge von mindestens N.

Der erste Schritt ist der WHERE-Filter. Im zweiten Schritt verwenden Sie erneut den Anker des Lücken-und-Inseln-Musters. Da wir zuerst gefiltert haben, bezeichnet eine Insel hier eine „Folge aufeinanderfolgender passender Tage“.

WITH qualifying AS (
  SELECT sale_date
  FROM sales
  WHERE amount > 100
)
SELECT * FROM qualifying ORDER BY sale_date;

Die passenden Folgen verankern

Nummerieren Sie die passenden Zeilen nach Datum und subtrahieren Sie die Nummer, um den Inselanker zu erhalten. Zeilen, die im Kalender aufeinanderfolgen und alle die Bedingung erfüllen, haben denselben Anker; ein nicht passender Tag wurde entfernt und unterbricht die Folge genau an der richtigen Stelle.

WITH qualifying AS (
  SELECT sale_date
  FROM sales
  WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
)
SELECT sale_date, sale_date - rn AS grp
FROM numbered;

Ausreichend lange Inseln beibehalten

Gruppieren Sie nach dem Anker, zählen Sie die Zeilen und behalten Sie nur Gruppen mit COUNT(*) >= 3. Wenn der Interviewer wieder die einzelnen passenden Daten sehen möchte, verbinden Sie die beibehaltenen Anker mit den nummerierten Zeilen.

WITH qualifying AS (
  SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
),
islands AS (
  SELECT sale_date - rn AS grp, COUNT(*) AS len
  FROM numbered
  GROUP BY sale_date - rn
  HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;

Gleitendes COUNT-Fenster

Ein eleganterer Ansatz, wenn N klein und fest ist: Verwenden Sie einen Fensterrahmen, um zu zählen, wie viele der benachbarten Zeilen die Bedingung ebenfalls erfüllen. Wenn ein Fenster aus N aufeinanderfolgenden Zeilen, das diese Zeile enthält, ausschließlich passende Zeilen umfasst, gehört die Zeile zum Ergebnis.

Fügen Sie zunächst ein boolesches Kennzeichen hinzu und summieren Sie dieses Kennzeichen anschließend über gleitende Fensterrahmen.

SELECT sale_date, amount,
  CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
FROM sales;

Über drei Fensterrahmen summieren

Für eine Folge mit genau 3 Zeilen gehört eine passende Zeile zum Ergebnis, wenn das 3-Zeilen-Fenster, das hier endet, hier zentriert ist oder hier beginnt, die Summe 3 ergibt. Berechnen Sie die drei gleitenden Summen und prüfen Sie, ob eine davon 3 entspricht.

Diese Technik bildet die Grundlage der Lösung für LeetCode 601 (Human Traffic of Stadium).

WITH flagged AS (
  SELECT sale_date, amount,
    CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
  FROM sales
),
w AS (
  SELECT *,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS s_end,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS s_mid,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) AS s_start
  FROM flagged
)
SELECT sale_date, amount
FROM w
WHERE ok = 1 AND (s_end = 3 OR s_mid = 3 OR s_start = 3);

Die Falle bei Kalenderlücken

Der Ansatz mit Fenstersummen verwendet ROWS. Dabei werden benachbarte Ergebniszeilen gezählt, nicht benachbarte Kalendertage. Wenn ein nicht passender Tag bereits herausgefiltert wurde, können zwei Zeilen im Ergebnis nebeneinanderliegen, ohne im Kalender aufeinanderzufolgen.

Lektion: Wenden Sie das gleitende Fenster auf die vollständige tägliche Folge an (filtern Sie nicht vorab) oder verwenden Sie die Methode mit dem Datumsanker, die Kalenderlücken automatisch berücksichtigt. Nennen Sie diesen Zielkonflikt im Vorstellungsgespräch.

Auf beliebiges N verallgemeinern

Ansatz 1 (Filtern, dann Inseln bilden) lässt sich problemlos verallgemeinern: Ändern Sie einfach HAVING COUNT(*) >= N. Das ist sein großer Vorteil gegenüber der Summe über mehrere Fenster, die bei wachsendem N weitere Fensterrahmen benötigt.

Für ein parametrisiertes oder großes N sollten Sie die Inselmethode bevorzugen — dabei ändern Sie nur einen Schwellenwert statt N−1 Fenster von Hand zu formulieren.

-- only the threshold changes for N = 5
HAVING COUNT(*) >= 5

Den passenden Ansatz auswählen

Eine kurze Entscheidungsregel für Ihre mündliche Antwort:

  • Filtern, dann Inseln bilden: berücksichtigt Kalenderlücken, lässt sich auf jedes N verallgemeinern und gibt vollständige Folgen zurück — die sichere Standardwahl.
  • Gleitende Fenstersumme: elegant für ein festes, kleines N in einer lückenlosen täglichen Folge, aber achten Sie auf die Falle zwischen ROWS und Kalenderdaten.

Beide Ansätze zu nennen und anschließend Ihre Wahl zu begründen, wird von Interviewern auf mittlerem bis seniorigem Niveau genau geschätzt.

Vollständige Lösung

Die portable Lösung für beliebiges N, die aufeinanderfolgende Kalendertage berücksichtigt und die passenden Daten zurückgibt:

WITH qualifying AS (
  SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
),
islands AS (
  SELECT sale_date - rn AS grp, COUNT(*) AS len
  FROM numbered
  GROUP BY sale_date - rn
  HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;

Kurzer Test

Erkennen Sie den subtilen Fehler.

Zusammenfassung

Für N aufeinanderfolgende Zeilen, die eine Bedingung erfüllen:

  • Filtern, dann Inseln bilden: Behalten Sie passende Zeilen, verankern Sie sie mit date - ROW_NUMBER(), gruppieren Sie sie und verwenden Sie HAVING COUNT(*) >= N. Dieser Ansatz lässt sich verallgemeinern und berücksichtigt Kalenderlücken.
  • Gleitende Fenstersumme: Markieren Sie Zeilen und summieren Sie sie über feste Fenster mit N Zeilen. Der Ansatz ist elegant, aber bei vorab gefilterten Daten müssen Sie auf den Unterschied zwischen ROWS und Kalenderdaten achten.

Als Nächstes: Die aktuelle aktive Streak eines Benutzers mit Stand heute berechnen.

Häufig gestellte Fragen

Ist die Lektion „N aufeinanderfolgende Zeilen mit erfüllter Bedingung“ kostenlos?

Ja — der vollständige Text von „N aufeinanderfolgende Zeilen mit erfüllter Bedingung“ 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 „N aufeinanderfolgende Zeilen mit erfüllter Bedingung“?

Das klassische Zeitfenstermuster „drei aufeinanderfolgende Tage mit Umsätzen über X“. 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 3 von 4.

Wie lange dauert die Lektion „N aufeinanderfolgende Zeilen mit erfüllter Bedingung“?

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. Aufeinanderfolgende Kalendertage erkennen
  2. Längste Serie pro Benutzer
  3. N aufeinanderfolgende Zeilen mit erfüllter Bedingung
  4. Aktuelle aktive Serie bis heute
← Zurück zu SQL Interview Prep