Förberedelse inför kodningsintervjuer · Lektion

Förändring från period till period

Beräkna tillväxt månad för månad och förändring dag för dag med LAG

Lektion 2 av 413 steg

Förändring från period till period är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 2 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örberedelse inför kodningsintervjuer, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.

Den garanterade analytikerfrågan

Om du söker en tjänst som dataanalytiker kan du räkna med frågan: "Beräkna tillväxt från månad till månad" eller "Vilken är förändringen från dag till dag?" Den är nästan omöjlig att undvika.

Byggstenen är LAG: hämta föregående periods värde och beräkna sedan antingen en absolut förändring eller en procentuell förändring. I den här lektionen används LAG för de mönster för förändring från period till period som intervjuare bedömer dig på.

Absolut förändring med LAG

Den enklaste varianten är den råa skillnaden mellan den aktuella perioden och den föregående. Hämta det föregående värdet med LAG och subtrahera det direkt i uttrycket.

Den första raden i sorteringsordningen har ingen föregående rad, så dess förändring är NULL. Det är korrekt, inte ett fel: det finns verkligen ingen föregående period att jämföra med.

SELECT
  month,
  revenue,
  revenue - LAG(revenue) OVER (ORDER BY month) AS mom_change
FROM monthly_sales
ORDER BY month;

Procentuell förändring

Intervjuare vill vanligtvis ha tillväxt uttryckt i procent. Formeln är (aktuellt - föregående) / föregående, multiplicerat med 100. Uttryck den direkt med LAG.

Var noga med beräkningsordningen och parenteserna; en felplacerad parentes är ett klassiskt misstag under tidspress.

SELECT
  month,
  revenue,
  100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
        / LAG(revenue) OVER (ORDER BY month) AS pct_growth
FROM monthly_sales
ORDER BY month;

Undvik heltalsdivision

En fallgrop som många kandidater går i: om revenue är ett heltal blir (110 - 100) / 100 lika med 0 i databaser som använder heltalsdivision.

Multiplicera med 100.0 (en flyttalsliteral) eller använd CAST för att först konvertera till ett decimaltal och tvinga fram flyttalsberäkning. Om du nämner detta självmant visar det att du är noggrann.

SELECT
  month,
  ROUND(
    100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
          / LAG(revenue) OVER (ORDER BY month), 2
  ) AS pct_growth
FROM monthly_sales;

Renare: beräkna en gång i en CTE

Att anropa LAG två gånger (för täljaren och nämnaren) är repetitivt och lätt att skriva fel. En vanlig omstrukturering är att beräkna det föregående värdet en gång i en CTE och sedan utföra aritmetiken i den yttre frågan.

Det blir tydligare i en whiteboardintervju och förhindrar att de två LAG-anropen ger olika resultat.

WITH t AS (
  SELECT
    month,
    revenue,
    LAG(revenue) OVER (ORDER BY month) AS prev
  FROM monthly_sales
)
SELECT
  month,
  revenue,
  ROUND(100.0 * (revenue - prev) / prev, 2) AS pct_growth
FROM t;

Skydda mot division med noll

Om värdet för den föregående perioden kan vara 0 delar procentformeln med noll och ger ett fel. Använd NULLIF(prev, 0) så att nämnaren blir NULL och resultatet blir NULL i stället för ett undantag.

Defensiv division är en liten detalj som intervjuare lägger märke till hos kandidater som tänker produktionsmässigt.

SELECT
  month,
  revenue,
  100.0 * (revenue - prev) / NULLIF(prev, 0) AS pct_growth
FROM (
  SELECT month, revenue,
         LAG(revenue) OVER (ORDER BY month) AS prev
  FROM monthly_sales
) s;

Förändring från period till period per grupp

De flesta verkliga frågor är avgränsade: tillväxt från månad till månad per produkt eller per region. Lägg till PARTITION BY så att varje grupps tidsserie endast jämförs med sig själv.

Den tidigaste månaden i varje grupp återställs till NULL och jämförs aldrig över produktgränser.

SELECT
  product_id,
  month,
  revenue,
  revenue - LAG(revenue) OVER (
    PARTITION BY product_id
    ORDER BY month
  ) AS mom_change
FROM product_sales;

År över år med offset

För år-för-år-jämförelser av månadsdata, där raderna ligger en månad från varandra, jämför du med värdet 12 rader tillbaka. Offset-argumentet gör detta direkt: LAG(revenue, 12).

Detta förutsätter en rad per månad utan luckor. Om månader kan saknas skulle du i stället koppla ihop raderna med ett explicit datum, en nyans som är värd att nämna högt.

SELECT
  month,
  revenue,
  revenue - LAG(revenue, 12) OVER (ORDER BY month) AS yoy_change
FROM monthly_sales
ORDER BY month;

Föraggregera före jämförelsen

Råa händelsetabeller är inte summerade per månad i förväg. Ett realistiskt svar börjar därför med att aggregera till en rad per period och tillämpar sedan LAG på det aggregerade resultatet, vanligtvis via en CTE.

Om du använder LAG på oaggregerade rader jämför du enskilda transaktioner i stället för månadssummor, vilket är ett vanligt logiskt fel.

WITH monthly AS (
  SELECT DATE_TRUNC('month', order_date) AS mth,
         SUM(amount) AS revenue
  FROM orders
  GROUP BY 1
)
SELECT mth, revenue,
       revenue - LAG(revenue) OVER (ORDER BY mth) AS mom_change
FROM monthly
ORDER BY mth;

Tolka det första NULL

Intervjuare frågar ibland: "Varför är tillväxten på den första raden NULL, och är det acceptabelt?" Det rätta svaret är att det inte finns någon föregående period, så förändringen är odefinierad och NULL representerar detta korrekt.

Om verksamheten i stället vill ha 0 använder du LAG(revenue, 1, 0) eller COALESCE, men bara om det stämmer med den avsedda betydelsen.

Märk förändringens riktning

Intervjuare kan ibland utöka frågan: "Markera också om varje månad ökade, minskade eller låg stilla." Lägg jämförelsen med LAG i ett CASE-uttryck.

En jämförelse med det föregående värdet ger en tydlig, lättläst trendkolumn utöver den numeriska förändringen och visar på ett bra sätt NULL eller en standardetikett för den första perioden, som saknar jämförelse.

SELECT
  month,
  revenue,
  CASE
    WHEN revenue > LAG(revenue) OVER (ORDER BY month) THEN 'up'
    WHEN revenue < LAG(revenue) OVER (ORDER BY month) THEN 'down'
    ELSE 'flat'
  END AS trend
FROM monthly_sales
ORDER BY month;

Snabb kontroll

Hitta det vanliga misstaget i frågor som beräknar procentuell förändring.

Sammanfattning

Förändring från period till period är LAG plus aritmetik:

  • Absolut förändring: value - LAG(value) OVER (ORDER BY period).
  • Procentuell förändring: 100.0 * (value - prev) / NULLIF(prev, 0).
  • Tvinga fram flyttalsberäkning, skydda mot division med noll och föraggregera till en rad per period.
  • Avgränsa med PARTITION BY och använd offset för år-för-år-jämförelser.

Nästa steg: dela upp rader i grupper och nivåer med NTILE.

Gratis att börja

Lär dig Förberedelse inför kodningsintervjuer 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
90
Lektioner
360

Vanliga frågor

Är lektionen ”Förändring från period till period” gratis?

Ja – hela texten till ”Förändring från period till period” 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örberedelse inför kodningsintervjuer, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.

Vad lär jag mig i ”Förändring från period till period”?

Beräkna tillväxt månad för månad och förändring dag för dag med LAG Ni övar på Förberedelse inför kodningsintervjuer 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örberedelse inför kodningsintervjuer?

Du behöver inga förkunskaper. Utbildningen i Förberedelse inför kodningsintervjuer 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 2 av 4.

Hur lång tid tar lektionen ”Förändring från period till period”?

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örberedelse inför kodningsintervjuer-lektionen?

Ja. Varje Förberedelse inför kodningsintervjuer-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. LAG och LEAD för intilliggande rader
  2. Förändring från period till period
  3. NTILE för indelning
  4. FIRST_VALUE, LAST_VALUE och ramkanter
← Tillbaka till Förberedelse inför kodningsintervjuer