0Pricing
SQL Interview Prep · Lektion

Zahlen- und Datumsreihen erzeugen

Rekursion verwenden, um Sequenzen für Lückenschluss und Kalender zu erzeugen

Zahlen- und Datumsreihen erzeugen 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.

Rekursion ohne Hierarchie

Rekursive CTEs sind nicht nur für Bäume gedacht. Eine zweite wichtige Anwendung ist das Erzeugen von Sequenzen: einer Folge von Zahlen oder jedem Datum in einem Bereich. Interviewer fragen danach, wenn ein Problem das Auffüllen von Lücken erfordert — also das Erzeugen von Zeilen, die in keiner Tabelle vorhanden sind.

Die klassische Aufgabenstellung lautet: „Zeigen Sie die Umsätze pro Tag für den Monat, einschließlich der Tage ohne Umsatz.“ Sie können einen fehlenden Tag nicht anzeigen, sofern Sie nicht zuerst alle Tage erzeugen.

Eine einfache Zahlenreihe

Der Anker liefert die erste Zahl; der rekursive Teil addiert in jeder Iteration eins; ein WHERE im rekursiven Teil beendet die Rekursion. Damit werden die Zahlen 1 bis 10 erzeugt.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 10
)
SELECT n FROM nums;

Das Abbruchprädikat

Anders als ein Organigramm hat eine Zahlenreihe kein natürliches Blatt, an dem sie enden kann — Sie könnten unendlich weiterzählen. Daher müssen Sie im rekursiven Teil eine explizite Abbruchbedingung hinzufügen: WHERE n < 10.

Wenn n 10 erreicht, filtert das WHERE der nächsten Iteration die einzige Kandidatenzeile heraus, der rekursive Teil liefert nichts zurück und die Rekursion endet. Diese Absicherung zu vergessen ist die häufigste Ursache für unkontrollierte Rekursion in Interviews.

Den Bereich parametrisieren

Machen Sie die Reihe flexibel, indem Sie die Obergrenze aus einem Wert oder einer Variablen beziehen. Hier erzeugen wir 1 bis N, wobei N vorgegeben wird. Dieselbe Struktur erzeugt auch bei 0 beginnende oder schrittweise Sequenzen — ändern Sie dazu einfach den Anker und das Inkrement.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 2 FROM nums WHERE n + 2 <= 99
)
SELECT n FROM nums;  -- odd numbers 1,3,5,...,99

Eine Datumsreihe erzeugen

Mit Datumsarithmetik statt Ganzzahlarithmetik erhalten Sie einen Kalender. Der Anker ist das Startdatum; der rekursive Teil addiert einen Tag, bis das Enddatum überschritten wird.

Die Syntax zum Addieren eines Tages variiert je nach Dialekt — diese Form im Postgres-Stil verwendet ein Intervall.

WITH RECURSIVE cal AS (
    SELECT DATE '2024-01-01' AS d
    UNION ALL
    SELECT d + INTERVAL '1 day'
    FROM cal
    WHERE d < DATE '2024-01-31'
)
SELECT d FROM cal;

Lücken mit einem LEFT JOIN auffüllen

Kombinieren Sie nun den Kalender mit echten Daten. Erzeugen Sie jeden Tag und verknüpfen Sie dann die Umsatztabelle per LEFT JOIN, sodass fehlende Tage mit einem NULL erscheinen, das Sie mit COALESCE in 0 umwandeln.

Dieses zweistufige Muster — zuerst das Gerüst erzeugen, dann die Fakten per LEFT JOIN verknüpfen — ist das Herzstück jeder Antwort zum Auffüllen von Lücken.

WITH RECURSIVE cal AS (
    SELECT DATE '2024-01-01' AS d
    UNION ALL
    SELECT d + INTERVAL '1 day' FROM cal
    WHERE d < DATE '2024-01-07'
)
SELECT cal.d, COALESCE(SUM(s.amount), 0) AS total
FROM cal
LEFT JOIN sales s ON s.sale_date = cal.d
GROUP BY cal.d
ORDER BY cal.d;

Monatliche und wöchentliche Gerüste

Ändern Sie das Inkrement, um gröbere Kalender zu erstellen. Fügen Sie INTERVAL '1 month' für ein Monatsgerüst oder INTERVAL '7 day' für Wochen hinzu. Das ist nützlich, wenn ein Interviewer einen Monatsbericht einschließlich leerer Monate erwartet.

WITH RECURSIVE months AS (
    SELECT DATE '2024-01-01' AS m
    UNION ALL
    SELECT m + INTERVAL '1 month' FROM months
    WHERE m < DATE '2024-12-01'
)
SELECT m FROM months;

Dialektunterschiede bei der Datumsarithmetik

Datumsarithmetik ist der am wenigsten portable Teil dieser Abfragen. Kennen Sie die Varianten:

  • Postgres: d + INTERVAL '1 day'.
  • MySQL: DATE_ADD(d, INTERVAL 1 DAY).
  • SQL Server: DATEADD(DAY, 1, d).
  • SQLite: date(d, '+1 day').

Zu erwähnen, dass die Rekursionsstruktur identisch ist und sich nur die Datumsfunktion ändert, ist eine starke, dialektbewusste Antwort.

Rekursion vs. generate_series

Postgres liefert mit generate_series() eine integrierte Funktion, die Zahlen oder Datumswerte ohne Rekursion erzeugt und schneller sowie klarer ist:

SELECT generate_series(DATE '2024-01-01', DATE '2024-01-31', INTERVAL '1 day');

Wenn die Datenbank des Interviewers dies unterstützt, bevorzugen Sie diese Funktion. Viele Engines (MySQL, SQL Server vor neueren Versionen) bieten sie jedoch nicht — genau dann ist die rekursive CTE der portable Fallback.

Achten Sie auf das Rekursionslimit

Beim Erzeugen einer großen Reihe kann das Rekursionslimit der Engine erreicht werden. SQL Server verwendet standardmäßig MAXRECURSION 100, daher schlägt ein Kalender mit 365 Tagen fehl, sofern Sie nicht OPTION (MAXRECURSION 0) anhängen, um das Limit aufzuheben.

Postgres hat kein festes Limit, aber eine unkontrollierte Reihe mit einer falschen Bedingung kann laufen, bis der Speicher erschöpft ist. Prüfen Sie immer, ob Ihr Abbruchprädikat korrekt ist, bevor Sie den Umfang vergrößern.

-- SQL Server: lift the 100-row recursion cap
-- ...recursive CTE here...
SELECT * FROM cal
OPTION (MAXRECURSION 0);

Die Reihe per CROSS JOIN kombinieren

Eine erzeugte Reihe ist oft nur ein Baustein. Sobald Sie eine Zahlen-CTE haben, können Sie sie per CROSS JOIN verwenden, um Zeilen zu erweitern oder aufzulösen — etwa um jede Bestellzeile anhand ihrer Menge zu wiederholen oder einen Datumsbereich für jeden Kunden aufzufächern.

Zu erkennen, dass Rekursion einen wiederverwendbaren Baustein und nicht nur eine fertige Antwort erzeugt, unterscheidet eine ausgearbeitete Interviewantwort von einer auswendig gelernten.

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 10
)
SELECT o.order_id, nums.n AS unit
FROM orders o
JOIN nums ON nums.n <= o.quantity;

Kurze Überprüfung

Warum ist das Abbruchprädikat bei einer Zahlen- oder Datumsreihe entscheidend?

Zusammenfassung

Rekursion kann Zeilen erzeugen, die in keiner Tabelle vorhanden sind:

  • Den ersten Wert im Anker setzen und im rekursiven Teil inkrementieren.
  • Immer ein explizites Abbruchprädikat hinzufügen — Sequenzen haben kein natürliches Ende.
  • Ein Datums-/Zahlengerüst erzeugen, anschließend die Fakten per LEFT JOIN verknüpfen und zum Auffüllen von Lücken COALESCE verwenden.
  • Wenn verfügbar, generate_series bevorzugen; das MAXRECURSION-Limit in SQL Server beachten.

Als Nächstes: die Sicherheitsmechanismen, die verhindern, dass die Rekursion unkontrolliert weiterläuft.

Häufig gestellte Fragen

Ist die Lektion „Zahlen- und Datumsreihen erzeugen“ kostenlos?

Ja — der vollständige Text von „Zahlen- und Datumsreihen erzeugen“ 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 „Zahlen- und Datumsreihen erzeugen“?

Rekursion verwenden, um Sequenzen für Lückenschluss und Kalender zu erzeugen 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 „Zahlen- und Datumsreihen erzeugen“?

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. Anker- und rekursive Elemente
  2. Ein Organigramm durchlaufen
  3. Zahlen- und Datumsreihen erzeugen
  4. Unendliche Rekursion vermeiden
← Zurück zu SQL Interview Prep