0Pricing
SQL Interview Prep · Lezione

Variazione tra periodi

Calcolare la crescita mese su mese e le variazioni giorno su giorno con LAG

Variazione tra periodi è una lezione SQL Interview Prep gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.

La domanda immancabile per un analista

Se sostiene un colloquio per un ruolo di analista dei dati, si aspetti domande come: «Calcoli la crescita mese su mese» oppure «Qual è la variazione giorno su giorno?» Sono domande praticamente inevitabili.

Il componente fondamentale è LAG: recuperare il valore del periodo precedente e poi calcolare una differenza assoluta o una variazione percentuale. In questa lezione trasformeremo LAG negli schemi di variazione periodo su periodo su cui i selezionatori valutano la Sua preparazione.

Variazione assoluta con LAG

La versione più semplice è la differenza effettiva tra il periodo corrente e quello precedente. Recuperi il valore precedente con LAG e calcoli la differenza direttamente.

La prima riga nell'ordine non ha un predecessore, quindi la sua variazione è NULL. È corretto, non è un errore: non esiste davvero un periodo precedente con cui effettuare il confronto.

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

Variazione percentuale

Nei colloqui, di solito, la crescita viene richiesta in percentuale. La formula è (corrente - precedente) / precedente, moltiplicata per 100. La esprima direttamente con LAG.

Faccia attenzione all'ordine delle operazioni e alle parentesi: una parentesi nella posizione sbagliata è un errore classico quando si è sotto pressione.

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;

Evitare la divisione intera

Una trappola in cui cadono molti candidati: se revenue è un intero, (110 - 100) / 100 restituisce 0 nei database che eseguono la divisione intera.

Moltiplichi per 100.0 (un valore letterale float) oppure applichi prima CAST a un tipo decimale, così da forzare i calcoli in virgola mobile. Menzionare spontaneamente questo dettaglio dimostra attenzione.

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;

Più pulito: calcolare una volta in una CTE

Chiamare LAG due volte (per numeratore e denominatore) è ripetitivo e rende facile commettere errori di battitura. Un refactoring comune consiste nel calcolare una sola volta il valore precedente in una CTE, per poi eseguire i calcoli nella query esterna.

In questo modo la soluzione è più leggibile durante un colloquio alla lavagna ed evita differenze tra le due chiamate a LAG.

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;

Gestire la divisione per zero

Se il valore del periodo precedente può essere 0, la formula percentuale divide per zero e genera un errore. Usi NULLIF(prev, 0) per fare in modo che il denominatore diventi NULL e che il risultato sia NULL anziché un'eccezione.

Una divisione gestita in modo difensivo è un piccolo dettaglio che i selezionatori notano nei candidati attenti agli aspetti di produzione.

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;

Variazione periodo su periodo per gruppo

La maggior parte delle domande reali riguarda un ambito specifico: crescita mese su mese per prodotto oppure per regione. Aggiunga PARTITION BY affinché la serie di ogni gruppo venga confrontata solo con sé stessa.

Il primo mese di ogni gruppo restituisce nuovamente NULL e non viene mai confrontato oltre i confini del prodotto.

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

Anno su anno con offset

Per calcolare la variazione anno su anno su dati mensili in cui le righe sono distanti un mese, deve confrontare il valore con quello di 12 righe precedenti. L'argomento offset permette di farlo direttamente: LAG(revenue, 12).

Questo presuppone una riga per ogni mese e l'assenza di intervalli vuoti. Se alcuni mesi possono mancare, dovrebbe invece eseguire un join su una data esplicita: è un dettaglio sottile che vale la pena dichiarare a voce.

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

Aggregare prima del confronto

Le tabelle degli eventi grezzi non sono preaggregate per mese. Una risposta realistica aggrega prima i dati in modo da ottenere una riga per periodo, quindi applica LAG al risultato aggregato, di solito tramite una CTE.

Applicare LAG a righe non aggregate confronta singole transazioni, non i totali mensili: è un errore logico comune.

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;

Interpretare il primo NULL

A volte i selezionatori chiedono: «Perché la crescita della prima riga è NULL e va bene così?». La risposta corretta è che non esiste un periodo precedente, quindi la variazione non è definita e NULL la rappresenta correttamente.

Se invece l'attività richiede 0, userebbe LAG(revenue, 1, 0) oppure COALESCE, ma soltanto se questo riflette il significato desiderato.

Indicare la direzione della crescita

A volte i selezionatori ampliano la domanda: «Indichi anche se ogni mese è cresciuto, diminuito o rimasto invariato». Racchiuda il confronto con LAG in un'espressione CASE.

Il confronto con il valore precedente fornisce una colonna di tendenza chiara e leggibile, oltre alla differenza numerica, e gestisce correttamente NULL o un'etichetta predefinita per il primo periodo, che non ha un confronto.

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;

Verifica rapida

Individui l'errore comune nelle query per il calcolo della variazione percentuale.

Riepilogo

La variazione periodo su periodo si ottiene con LAG e l'aritmetica:

  • Variazione assoluta: value - LAG(value) OVER (ORDER BY period).
  • Variazione percentuale: 100.0 * (value - prev) / NULLIF(prev, 0).
  • Forzi i calcoli in virgola mobile, gestisca la divisione per zero e aggreghi i dati in modo da avere una riga per periodo.
  • Definisca l'ambito con PARTITION BY e usi l'offset per la variazione anno su anno.

Prossimo argomento: suddividere le righe in bucket e fasce con NTILE.

Domande Frequenti

La lezione «Variazione tra periodi» è gratuita?

Sì — il testo completo di «Variazione tra periodi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.

Cosa imparerò in «Variazione tra periodi»?

Calcolare la crescita mese su mese e le variazioni giorno su giorno con LAG Eserciti SQL Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Interview Prep?

Non è richiesta alcuna esperienza precedente. SQL Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Variazione tra periodi»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Interview Prep?

Sì. Ogni lezione SQL Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. LAG e LEAD per le righe adiacenti
  2. Variazione tra periodi
  3. NTILE per creare fasce
  4. FIRST_VALUE, LAST_VALUE e limiti del frame
← Torna a SQL Interview Prep