SQL Academy · Les

Reeksen genereren

Maak rijen met recursie.

Les 3 van 413 stappen

Reeksen genereren is een gratis SQL Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject SQL Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus SQL Academy bevat in totaal 4 lessen.

Wat is een gegenereerde reeks?

Soms heb je een lijst met getallen, datums of andere opeenvolgende waarden nodig die in geen enkele tabel bestaan. Met SQL kun je deze direct maken met behulp van recursie of ingebouwde functies.

In deze les leer je reeksen genereren met WITH RECURSIVE — een krachtig hulpmiddel waarmee een query naar zijn eigen uitvoer kan verwijzen.

Je eerste recursieve CTE

Een recursieve CTE (algemene tabel-expressie) bestaat uit twee delen die met UNION ALL zijn verbonden: een basisgeval dat de eerste rij oplevert en een recursieve stap die naar de CTE zelf verwijst om de volgende rij te produceren.

De recursie stopt wanneer de recursieve stap geen rijen oplevert.

WITH RECURSIVE counter(n) AS (
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM counter WHERE n < 5
)
SELECT n FROM counter;

Hoe recursie zich ontvouwt

Het helpt om elke stap afzonderlijk te bekijken. Het basisgeval initialiseert de tabel en elke recursieve doorgang voegt één rij toe totdat de WHERE-voorwaarde niet meer geldt.

Voor de query WHERE n < 5 genereert de database-engine de rijen 1, 2, 3, 4 en 5. Daarna stopt hij, omdat 5 < 5 onwaar is.

WITH RECURSIVE steps(n, note) AS (
  SELECT 1, 'base case'
  UNION ALL
  SELECT n + 1, 'recursive step'
  FROM steps
  WHERE n < 4
)
SELECT n, note FROM steps;

Even getallen genereren

Je kunt de stapgrootte eenvoudig wijzigen door in het recursieve gedeelte meer dan 1 op te tellen. Dit levert elk even getal van 2 tot en met 10 op.

Het patroon is altijd: next_value = current_value + step.

WITH RECURSIVE evens(n) AS (
  SELECT 2
  UNION ALL
  SELECT n + 2 FROM evens WHERE n < 10
)
SELECT n FROM evens;

Aftellen

Recursie is niet beperkt tot oplopend tellen. Trek af in plaats van op te tellen en je krijgt een aflopende reeks. Zorg dat de stopvoorwaarde > gebruikt in plaats van < om een oneindige lus te voorkomen.

WITH RECURSIVE countdown(n) AS (
  SELECT 10
  UNION ALL
  SELECT n - 1 FROM countdown WHERE n > 1
)
SELECT n FROM countdown;

Een datumbereik genereren

Een van de praktischste toepassingen van recursieve CTE's is het opbouwen van een datumsreeks. Je begint bij een specifieke datum en telt steeds één dag op totdat je een einddatum bereikt.

Dit is vooral handig om hiaten in rapporten op te vullen — elke datum verschijnt, ook als er voor die dag geen gegevens zijn.

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

Hiaten in rapporten opvullen met een datumsreeks

Stel je een tabel sales voor die alleen rijen bevat op dagen waarop verkoop heeft plaatsgevonden. Door een gegenereerde datumsreeks met een LEFT JOIN aan de verkooptabel te koppelen, krijg je elke dag in het bereik, met NULL voor dagen zonder verkoop.

WITH RECURSIVE cal(d) AS (
  SELECT DATE '2024-03-01'
  UNION ALL
  SELECT d + INTERVAL '1 day' FROM cal WHERE d < DATE '2024-03-05'
),
sales(sale_date, amount) AS (
  VALUES
    (DATE '2024-03-01', 100),
    (DATE '2024-03-03', 250),
    (DATE '2024-03-05', 180)
)
SELECT cal.d, COALESCE(sales.amount, 0) AS amount
FROM cal
LEFT JOIN sales ON cal.d = sales.sale_date
ORDER BY cal.d;

Een tafel van vermenigvuldiging genereren

Recursieve CTE's kunnen meerdere kolommen bevatten, zodat je uitgebreidere uitvoer kunt opbouwen. Hier worden tegelijk een rij-index en een berekende waarde bijgehouden.

WITH RECURSIVE mult(n, result) AS (
  SELECT 1, 1 * 7
  UNION ALL
  SELECT n + 1, (n + 1) * 7
  FROM mult
  WHERE n < 10
)
SELECT n, result AS seven_times_n FROM mult;

Fibonacci-getallen

Fibonacci is een klassieke reeks waarin elk getal de som is van de twee voorgaande: 0, 1, 1, 2, 3, 5, 8 …

Een recursieve CTE houdt zowel de huidige waarde a als de volgende waarde b bij en wisselt deze bij elke stap om.

WITH RECURSIVE fib(a, b) AS (
  SELECT 0, 1
  UNION ALL
  SELECT b, a + b FROM fib WHERE a < 100
)
SELECT a AS fibonacci FROM fib;

generate_series gebruiken in PostgreSQL

PostgreSQL biedt een ingebouwde snelkoppeling met de naam generate_series() waarmee je reeksen kunt maken zonder een recursieve CTE te schrijven. De functie accepteert een beginwaarde, een eindwaarde en een optionele stapgrootte.

Dit is de beknoptste manier om getal- of datumbereiken te genereren in PostgreSQL.

SELECT gs AS num
FROM generate_series(1, 10, 2) AS gs;

Maandelijkse intervallen genereren

Geef een interval van '1 month' door aan generate_series() om een maandkalender op te bouwen. Dit is ideaal voor maandelijkse rapportkoppen of om te controleren welke maanden geen gegevens bevatten.

SELECT gs::DATE AS month_start
FROM generate_series(
  '2024-01-01'::DATE,
  '2024-06-01'::DATE,
  INTERVAL '1 month'
) AS gs;

Kennistoets

Toets je begrip van het genereren van reeksen met recursieve CTE's.

Samenvatting: reeksen en sequenties genereren

In deze les heb je geleerd hoe je reeksen met getallen en datums kunt maken zonder brontabel:

  • WITH RECURSIVE — een basisgeval plus een recursieve stap, verbonden met UNION ALL; stopt wanneer de recursieve stap geen rijen oplevert.
  • Flexibele stapgrootte — tel een willekeurige waarde op of trek die af om omhoog of omlaag te tellen, of waarden over te slaan.
  • Datumbereiken — voeg een interval toe om dagelijkse, maandelijkse of aangepaste kalenderreeksen te genereren.
  • CTE's met meerdere kolommen — neem extra toestand mee tussen iteraties voor uitgebreidere uitvoer, zoals Fibonacci.
  • generate_series() — de ingebouwde functie van PostgreSQL voor de beknoptste reeksen met getallen en datums.

Gegenereerde reeksen zijn onmisbaar voor het opvullen van hiaten in rapporten, het maken van testgegevens en elke situatie waarin je een volledig bereik aan waarden nodig hebt, ongeacht wat de gegevens bevatten.

Gratis beginnen

Leer SQL met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
46
Lessen
183

Veelgestelde vragen

Is de les “Reeksen genereren” gratis?

Ja — de volledige tekst van “Reeksen genereren” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus SQL Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus SQL Academy bevat in totaal 4 lessen.

Wat leer ik in “Reeksen genereren”?

Maak rijen met recursie. Je oefent met SQL Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met SQL Academy te beginnen?

Ervaring vooraf is niet nodig. SQL Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Reeksen genereren”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over SQL Academy?

Ja. Elke les over SQL Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Hoe recursieve CTE's werken
  2. Een categoriestructuur doorlopen
  3. Reeksen genereren
  4. Oneindige lussen vermijden
← Terug naar SQL Academy