DAX, Introduzione alla Time Intelligence
Potrebbe interessarti:
Se vuoi imparare a preparare, modellare, visualizzare e analizzare i dati aziendali in modo efficace, dai un’occhiata al corso Introduzione a Power BI, e al Corso Avanzato Power BI DAX.
Cos’è la Time Intelligence?
In Power BI, con il termine Time Intelligence si intende un insieme di funzioni e tecniche pensate per gestire calcoli che coinvolgono il tempo: date, periodi, confronti temporali e aggregazioni su intervalli temporali. Questi calcoli sono fondamentali perché la maggior parte delle analisi aziendali non si limita a osservare i dati “nel presente”, ma deve rispondere a domande come:
- quanto abbiamo venduto quest’anno rispetto all’anno scorso?
- qual è la somma cumulativa delle vendite da inizio mese a oggi (MTD) o da inizio anno (YTD)?
- quali sono state le vendite del trimestre precedente o della settimana scorsa?
- come si confronta l’andamento mese su mese (MoM) o anno su anno (YoY)?
In DAX, la Time Intelligence è supportata da un insieme di funzioni predefinite
(come SAMEPERIODLASTYEAR, PREVIOUSMONTH, TOTALYTD, e molte altre),
che semplificano l’implementazione dei calcoli legati al tempo.
Queste funzioni permettono di esprimere, con poche righe di codice,
logiche che altrimenti richiederebbero espressioni molto più complesse, ad esempio:
- confrontare il valore di una Measure in un periodo con quello di un periodo precedente;
- calcolare valori cumulativi (YTD, QTD, MTD);
- spostare intervalli di date in avanti o indietro nel tempo;
- confrontare periodi paralleli, come lo stesso mese dell’anno precedente o lo stesso trimestre di due anni fa.
Le funzioni di Time Intelligence lavorano sempre a partire da una data di riferimento, che viene determinata dal Filter Context corrente. Espressioni come “Previous Month” o “Same Period Last Year” sono infatti relative alla data (o all’intervallo di date) presente nel contesto di filtro attivo. Per questo motivo, nella maggior parte dei casi è necessario che una data specifica (un anno, un trimestre, un mese o un singolo giorno) sia filtrata tramite slicer, filtri di pagina oppure direttamente nel visual utilizzato. In assenza di un contesto temporale ben definito, molte funzioni di Time Intelligence non sono in grado di restituire un risultato significativo.
Dal punto di vista tecnico, queste funzioni restituiscono in genere una tabella virtuale
contenente una singola colonna di date,
derivata dalla tabella calendario (ad esempio DateTable[DateKey]),
che viene poi utilizzata da funzioni come CALCULATE
per modificare il Filter Context e ottenere il risultato finale.
Ecco i pattern maggiormente utilizzati:
Period To Date (Cumulative Total)
I pattern “Period To Date” (noti anche come “Cumulative Total”) servono a calcolare valori aggregati dall’inizio di un periodo fino alla data corrente. Sono molto utilizzati per monitorare l’andamento di un KPI nel tempo e rispondere a domande del tipo: “a quanto siamo arrivati finora, rispetto al periodo in corso?”. In Power BI, i casi più comuni sono:
| Pattern | Funzione DAX |
|---|---|
| YTD (Year-To-Date) | TOTALYTD([Measure], DateTable[DATEKEY]) |
| QTD (Quarter-To-Date) | TOTALQTD([Measure], DateTable[DATEKEY]) |
| MTD (Month-To-Date) | TOTALMTD([Measure], DateTable[DATEKEY]) |
In particolare:
- YTD (Year-To-Date) calcola il valore cumulativo dall’inizio dell’anno fino alla data corrente;
- QTD (Quarter-To-Date) calcola il valore cumulativo dall’inizio del trimestre fino alla data corrente;
- MTD (Month-To-Date) calcola il valore cumulativo dall’inizio del mese fino alla data corrente.
Per saperne di più, leggi il post DAX e Time Intelligence, Period To Date (Cumulative Total) con esempi.
Con il termine “data corrente” si intende, nella maggior parte dei casi,
la data (o l’intervallo di date) definita dal Filter Context:
ad esempio tramite uno slicer, un filtro di pagina
oppure il livello temporale utilizzato nel visual (anno, mese, giorno).
In alternativa, la data di riferimento può essere definita esplicitamente
nell’espressione DAX, ad esempio passando una colonna di date
o combinando queste funzioni con CALCULATE
per controllare in modo più fine il contesto temporale del calcolo.
Previous Period
I pattern “Previous Period” servono a confrontare un periodo con quello immediatamente precedente,
considerando sempre l’intero periodo di riferimento.
Ad esempio, la funzione PREVIOUSYEAR restituisce l’intero anno precedente
(partendo dal 1° gennaio fino al 31 dicembre),
indipendentemente dalla data corrente presente nel Filter Context.
Questi pattern sono tipicamente utilizzati per calcolare
la variazione rispetto al periodo precedente,
come il confronto con l’anno, il trimestre o il mese precedente,
e sono concettualmente diversi dai pattern “Period To Date”,
che invece calcolano valori cumulativi parziali.
In Power BI, i principali pattern “Previous Period” sono:
| Pattern | Funzione DAX |
|---|---|
| Previous Day | PREVIOUSDAY(DateTable[DATEKEY]) |
| Previous Month | PREVIOUSMONTH(DateTable[DATEKEY]) |
| Previous Quarter | PREVIOUSQUARTER(DateTable[DATEKEY]) |
| Previous Year | PREVIOUSYEAR(DateTable[DATEKEY]) |
Queste funzioni restituiscono una tabella di date che rappresenta
l’intero periodo immediatamente precedente a quello attualmente selezionato,
in base al Filter Context.
La tabella risultante viene poi utilizzata, tipicamente all’interno di CALCULATE,
per ricalcolare la Measure nel contesto temporale corretto.
È importante notare che, a differenza di funzioni come SAMEPERIODLASTYEAR,
i pattern “Previous Period” non mantengono la stessa granularità temporale
del periodo corrente, ma lavorano sempre su periodi completi (mese, trimestre o anno).
Same Period Last Year (YoY)
Il pattern “Same Period Last Year” (spesso indicato come “Year over Year” o “YoY”) viene utilizzato per confrontare lo stesso periodo temporale con quello dell’anno precedente, mantenendo esattamente lo stesso intervallo di date selezionato nel Filter Context. Ad esempio, se il contesto corrente è il mese di Marzo 2024, il pattern “Same Period Last Year” restituirà il mese di Marzo 2023; se invece il contesto è un intervallo di date specifico (ad esempio dal 10 al 20 marzo), il confronto verrà effettuato sugli stessi giorni dell’anno precedente.
In DAX, questo pattern può essere implementato in due modi equivalenti:
| Pattern | Funzione DAX |
|---|---|
| Same Period Last Year | SAMEPERIODLASTYEAR(DateTable[DATEKEY]) |
| Same Period Last Year | DATEADD(DateTable[DATEKEY], -1, YEAR) |
Entrambe le funzioni restituiscono una tabella di date
ottenuta spostando indietro di un anno
l’intervallo temporale presente nel Filter Context corrente.
La differenza principale è che SAMEPERIODLASTYEAR
è una funzione specifica per questo scenario,
mentre DATEADD è più generica e può essere utilizzata
anche per altri tipi di spostamenti temporali.
A differenza dei pattern “Previous Period”, che confrontano sempre periodi completi (mese, trimestre o anno), il pattern “Same Period Last Year” preserva la granularità e la durata del periodo selezionato, rendendolo particolarmente adatto ai confronti YoY accurati.
Parallel Period
I pattern “Parallel Period” permettono di ottenere periodi temporali equivalenti, spostati in avanti o indietro nel tempo di un determinato numero di unità (giorni, mesi, trimestri o anni). Sono particolarmente utili quando servono confronti temporali flessibili e quando si vuole controllare esplicitamente la granularità del periodo di confronto.
In DAX, questi pattern possono essere implementati tramite PARALLELPERIOD
(o, in molti casi, tramite DATEADD):
| Pattern | Funzione DAX |
|---|---|
| Same Month as Previous Year | PARALLELPERIOD(DateTable[DATEKEY], -12, MONTH) |
| Same Quarter as Previous Year | PARALLELPERIOD(DateTable[DATEKEY], -4, QUARTER) |
Le funzioni “Parallel Period” restituiscono una tabella di date
che rappresenta un periodo equivalente a quello corrente,
traslato nel tempo secondo i parametri specificati.
Questa tabella viene poi utilizzata, tipicamente all’interno di CALCULATE,
per ricalcolare la Measure nel contesto temporale desiderato.
A differenza dei pattern “Previous Period”, che lavorano sempre su periodi completi, e del pattern “Same Period Last Year”, che mantiene esattamente l’intervallo selezionato, i “Parallel Period” consentono di definire quanto e come spostare il periodo nel tempo.
Nota: il pattern “SAMEPERIODLASTYEAR”
può essere visto come un caso particolare di “Parallel Period”,
in cui l’offset è fissato a -1, e l’unità temporale è YEAR.
Rolling Period (Rolling Window)
I pattern “Rolling Period” permettono di effettuare analisi su un intervallo temporale “mobile”, che si aggiorna dinamicamente in funzione di una data di riferimento. Questo tipo di analisi è molto comune quando si vogliono osservare trend recenti o medie mobili, indipendentemente dalla suddivisione in mesi, trimestri o anni di calendario. Una Rolling Window (o Finestra Mobile) è un intervallo temporale che:
- si aggiorna dinamicamente in base alla data corrente;
- mantiene sempre la stessa ampiezza (es. 30 giorni, 2 trimestri, ecc.) (ad esempio 30 giorni, 12 mesi, 2 trimestri);
- si sposta in avanti nel tempo man mano che diventano disponibili nuove date.
In DAX, i pattern di tipo “Rolling Period” vengono in genere implementati
tramite la funzione DATESINPERIOD, che consente di definire una finestra temporale mobile
a partire da una data di riferimento e da una durata espressa in unità di tempo.
Alcuni esempi comuni sono:
| Pattern | Funzione DAX |
|---|---|
| Rolling 1 Anno | DATESINPERIOD(DateTable[DateKey], MAX(DateTable[DateKey]), -1, YEAR) |
| Rolling 1 Trimestre | DATESINPERIOD(DateTable[DateKey], MAX(DateTable[DateKey]), -1, QUARTER) |
| Rolling 1 Mese | DATESINPERIOD(DateTable[DateKey], MAX(DateTable[DateKey]), -1, MONTH) |
| Rolling 2 Settimane | DATESINPERIOD(DateTable[DateKey], MAX(DateTable[DateKey]), -2, WEEK) |
In questi esempi, la funzione MAX(DateTable[DateKey])
viene utilizzata per individuare la data di riferimento
all’interno del Filter Context corrente.
A partire da questa data, DATESINPERIOD costruisce una tabella di date
che rappresenta l’intervallo temporale mobile desiderato,
estendendosi all’indietro per la durata specificata.
La tabella risultante viene poi utilizzata, tipicamente all’interno di CALCULATE,
per ricalcolare la Misura sul periodo mobile, rendendo questi pattern ideali per
analisi di trend, confronti rolling e indicatori come
medie mobili o totali su finestre temporali scorrevoli.