Förberedelser inför SQL-intervjun · Lektion

Generera serier av tal och datum

Använd rekursion för att skapa sekvenser för luckfyllnad och kalendrar

Lektion 3 av 413 steg

Generera serier av tal och datum är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.

Rekursion utan hierarki

Rekursiva CTE:er används inte bara för träd. Ett annat viktigt användningsområde är att generera sekvenser: en serie tal eller varje datum i ett intervall. Intervjuare frågar om detta när ett problem kräver luckfyllnad — alltså att skapa rader som inte finns i någon tabell.

Den klassiska frågan lyder: "Visa försäljningen per dag under månaden, inklusive dagar utan försäljning." Du kan inte visa en dag som saknas om du inte först genererar alla dagar.

En enkel talserie

Anchor-delen initierar det första talet, den rekursiva medlemmen lägger till ett i varje iteration och en WHERE i den rekursiva medlemmen stoppar den. Detta genererar talen 1 till 10.

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

Termineringsvillkoret

Till skillnad från ett organisationsschema har en talserie inget naturligt löv där den kan stanna — du skulle kunna öka talet för evigt. Därför måste du lägga till ett uttryckligt termineringsvillkor i den rekursiva medlemmen: WHERE n < 10.

När n når 10 filtrerar nästa iterations WHERE bort den enda kandidatraden, den rekursiva medlemmen returnerar ingenting och rekursionen upphör. Att glömma detta villkor är den vanligaste orsaken till skenande rekursion i intervjuer.

Parametrisera intervallet

Gör serien flexibel genom att låta en värde eller variabel bestämma gränsen. Här genererar vi talen 1 till N, där N anges utifrån. Samma struktur kan skapa serier som börjar på 0 eller ökar med ett annat steg — ändra bara anchor-delen och ökningen.

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

Generera en datumserie

Byt ut heltalsberäkningar mot datumberäkningar så får du en kalender. Anchor-delen är startdatumet och den rekursiva medlemmen lägger till en dag tills datumet passerar slutdatumet.

Syntaxen för att lägga till en dag varierar mellan dialekter — den här Postgres-liknande formen använder ett 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;

Fylla luckor med en LEFT JOIN

Kombinera nu kalendern med verkliga data. Generera varje dag och gör sedan en LEFT JOIN mot försäljningstabellen, så att saknade dagar visas med NULL som du omvandlar till 0 med COALESCE.

Detta tvåstegsmönster — generera stommen och gör sedan en left join mot fakta — är kärnan i alla lösningar för luckfyllnad.

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;

Månads- och veckostommar

Ändra steget för att bygga kalendrar med grövre upplösning. Lägg till INTERVAL '1 month' för en månadsstomme eller INTERVAL '7 day' för veckor. Det är användbart när en intervjuare vill ha en månadsrapport som även innehåller tomma månader.

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;

Skillnader i datumberäkning mellan dialekter

Datumaritmetik är den minst portabla delen av dessa frågor. Känn till varianterna:

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

Att nämna att rekursionsstrukturen är identisk och att bara datumfunktionen ändras är ett starkt och dialektmedvetet svar.

Rekursion kontra generate_series

Postgres levereras med den inbyggda funktionen generate_series(), som skapar tal eller datum utan rekursion. Den är både snabbare och tydligare:

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

Om intervjuarens databas stöder den bör du föredra den. Många databasmotorer (MySQL och SQL Server före senare versioner) saknar den dock — det är precis då den rekursiva CTE:n fungerar som ett portabelt alternativ.

Se upp med rekursionsgränsen

Att generera en stor serie kan nå databasmotorns rekursionsgräns. SQL Server har som standard MAXRECURSION 100, så en kalender med 365 dagar misslyckas om du inte lägger till OPTION (MAXRECURSION 0) för att ta bort gränsen.

Postgres har ingen fast gräns, men en skenande serie med ett felaktigt villkor kan fortsätta tills minnet tar slut. Kontrollera alltid att termineringsvillkoret är korrekt innan du skalar upp.

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

CROSS JOIN med serien

En genererad serie är ofta bara en byggsten. När du väl har en numbers-CTE kan du använda CROSS JOIN för att utöka eller duplicera rader — till exempel för att upprepa varje orderrad utifrån dess kvantitet eller skapa en datumserie per kund.

Att förstå att rekursion skapar en återanvändbar byggsten, inte bara ett slutgiltigt svar, är det som skiljer ett genomarbetat intervjusvar från ett mekaniskt svar.

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;

Snabb kontroll

Varför är termineringsvillkoret avgörande i en tal- eller datumserie?

Sammanfattning

Rekursion kan skapa rader som inte finns i någon tabell:

  • Initiera det första värdet i anchor-delen och öka värdet i den rekursiva medlemmen.
  • Lägg alltid till ett uttryckligt termineringsvillkor — serier har inget naturligt slut.
  • Bygg en datum- eller talstomme och gör sedan en LEFT JOIN mot fakta och använd COALESCE för luckfyllnad.
  • Föredra generate_series där det finns tillgängligt och tänk på MAXRECURSION i SQL Server.

Nästa steg: säkerhetsteknikerna som hindrar rekursion från att skena.

Gratis att börja

Lär dig SQL med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
30
Lektioner
120

Vanliga frågor

Är lektionen ”Generera serier av tal och datum” gratis?

Ja – hela texten till ”Generera serier av tal och datum” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.

Vad lär jag mig i ”Generera serier av tal och datum”?

Använd rekursion för att skapa sekvenser för luckfyllnad och kalendrar Ni övar på Förberedelser inför SQL-intervjun med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Förberedelser inför SQL-intervjun?

Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Generera serier av tal och datum”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Förberedelser inför SQL-intervjun-lektionen?

Ja. Varje Förberedelser inför SQL-intervjun-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Ankare och rekursiva delar
  2. Traversera ett organisationsschema
  3. Generera serier av tal och datum
  4. Undvik oändlig rekursion
← Tillbaka till Förberedelser inför SQL-intervjun