Tecniche avanzate per le visualizzazioni delle metriche

Le tecniche avanzate per le visualizzazioni delle metriche consentono di esprimere logica di business complessa e riutilizzare le definizioni nel livello semantico. Questa pagina illustra due tecniche di questo tipo:

  • Misure di finestra: per calcoli su serie temporali, ad esempio medie mobili, totali cumulativi e variazioni tra periodi.
  • Componibilità: per la creazione di misure complesse facendo riferimento ad altre misure anziché riscrivere la logica.

Questa pagina presuppone la familiarità con i concetti di modellazione della visualizzazione delle metriche di base. Vedere Visualizzazioni delle metriche del modello.

Annotazioni

Gli esempi in questa pagina usano il set di dati di esempio TPC-H, che modella una supply chain all'ingrosso. Per altre informazioni sul set di dati TPC-H, vedere tpch. Per un'esercitazione end-to-end sull'uso di questo set di dati con le visualizzazioni delle metriche, vedere Esercitazione: Creare una visualizzazione delle metriche con join e modellazione dei dati.

Misure della finestra

Le misure finestra consentono di definire misure con aggregazioni finestrate, cumulative o semiadditive nelle visualizzazioni delle metriche. Supportano calcoli come medie mobili, variazioni da un periodo all'altro e totali progressivi.

È possibile aggiungere una misura della finestra nell'editor di Esplora cataloghi o in YAML.

Aggiungere una misura finestra nell'editor

Nella scheda interfaccia utente dell'editor di visualizzazione metriche fare clic su + Finestra durante la modifica di una misura. + Window è disponibile sia in modalità Builder che in modalità personalizzata. Le opzioni della finestra nell'editor corrispondono ai campi YAML descritti in Definire una misura della finestra.

Per altre informazioni sulla creazione e la modifica di misure, vedere Creare una visualizzazione delle metriche.

Definire una misura finestra

Una misura finestra include i campi obbligatori seguenti:

  • order: campo che determina l'ordinamento della finestra.

  • range: definisce l'extent della finestra. Tra i valori supportati sono inclusi current, cumulative, trailing, leading e all. Un intervallo trailing o leading utilizza un'unità di tempo con un campo data o timestamp order, come trailing 7 day, oppure nessuna unità nel caso di una colonna di interi consecutivi order, come trailing 3. Per la sintassi completa e le descrizioni, vedere Valori supportatirange. Per i dettagli sui modificatori inclusive e exclusive su trailing e leading, vedere Includere o escludere la riga di ancoraggio.

  • semiadditive: specifica come aggregare la misura quando il campo dell'ordine non è incluso nella GROUP BYquery. Valori possibili: first e last.

Una misura finestra supporta anche il campo facoltativo seguente:

  • offset: Sposta il frame della finestra avanti o indietro lungo il campo order di una quantità fissa. Usa un offset basato su data, ad esempio -12 month, in un campo data o timestamp order, per misure da un periodo all'altro come mese su mese o anno su anno. Utilizzare un offset numerico senza unità di misura, ad esempio -1, su una colonna di numeri interi consecutivi order per confrontare nell'ambito di un periodo aziendale che non è una data di calendario. Per la sintassi, le unità supportate e i vincoli, vedere Misure finestra.

Puoi anche usare un parametro intero come valore di una misura della finestra range o offset, in modo che il chiamante possa passare la dimensione della finestra al momento dell’esecuzione della query. Vedi Passa una dimensione di finestra come parametro.

Come offset sposta la cornice della finestra

Per i requisiti minimi di calcolo e di versione delle specifiche YAML, vedere Disponibilità delle funzionalità di visualizzazione delle metriche .

Il range campo definisce la forma della finestra rispetto alla riga di ancoraggio e offset scorre tale cornice in base all'intervallo specificato lungo order. La tabella seguente mostra il frame per ogni valore range con e senza un offset di k, relativo alla riga di ancoraggio t:

intervallo Cornice senza offset Cornice con offset: k
current [t, t] [t + k, t + k]
cumulative (-infinity, t] (-infinity, t + k]
trailing N [t - N, t) [t + k - N, t + k)
leading N (t, t + N] (t + k, t + k + N]
all intera partizione intera partizione (non modificata)

offset è indipendente da semiadditive. La scelta first o last continua comunque a controllare il modo in cui la misura si comprime quando order non è presente nel campo GROUP BY della query.

Per ottenere risultati ottimali, abbina offset alla venatura naturale di order. Per i dati mensili, offset: -12 month è preferibile a offset: -365 day poiché l'aritmetica relativa a mesi e anni rispetta la diversa durata dei mesi e gli anni bisestili, mentre l'aritmetica di day non lo fa.

Includere o escludere la riga di ancoraggio

Per i requisiti minimi di calcolo e di versione delle specifiche YAML, vedere Disponibilità delle funzionalità di visualizzazione delle metriche .

Per gli intervalli trailing e leading, la parola chiave facoltativa inclusive o exclusive controlla se il valore della finestra della riga di ancoraggio (ad esempio, oggi) fa parte della finestra mobile:

Keyword Meaning Ancorare la riga nell'intervallo?
inclusive n unità che includono la riga di ancoraggio. Sì
exclusive (impostazione predefinita) n unità che non includono la riga di ancoraggio. NO

L'esempio seguente mostra come inclusive e exclusive influiscono sulla finestra mobile per la data di ancoraggio 2025-01-05 con trailing 3 day.

Si supponga che i dati sottostanti dispongano di una riga al giorno con i valori seguenti:

Date Valore
2025-01-02 1
2025-01-03 4
2025-01-04 2
2025-01-05 (ancoraggio) 5

Ogni modificatore seleziona tre giorni di righe relative all'ancoraggio e somma i relativi valori:

Modificatore Date nella finestra Values Sum
trailing 3 day inclusive 01-03, 01-04, 01-05 4 + 2 + 5 11
trailing 3 day exclusive 01-02, 01-03, 01-04 1 + 4 + 2 7

leading gli intervalli seguono la stessa logica nella direzione opposta.

Esempio di misura finestra arretrata, mobile o avanzata

Nell'esempio seguente viene calcolato un conteggio mobile su 7 giorni dei clienti che hanno effettuato ordini. Questa metrica tiene traccia delle tendenze di engagement dei clienti nel tempo mostrando il numero di clienti distinti che hanno effettuato acquisti nella settimana fino a ogni data.

version: 1.1

source: samples.tpch.orders
filter: o_orderdate > DATE'1998-01-01'

fields:
  - name: date
    expr: o_orderdate

measures:
  - name: t7d_customers
    expr: COUNT(DISTINCT o_custkey)
    window:
      - order: date
        range: trailing 7 day
        semiadditive: last

Per questo esempio, si applica la configurazione seguente:

  • order: date specifica che il date campo ordina la finestra.
  • range: trailing 7 day definisce la finestra come i 7 giorni precedenti a ogni data, escludendo la data stessa.
  • semiadditive: last restituisce l'ultimo valore nella finestra di 7 giorni quando date non è una colonna di raggruppamento.
Creare la visualizzazione delle metriche con SQL

Per creare questa vista della metrica al di fuori di Catalog Explorer, racchiudi il codice YAML in CREATE OR REPLACE VIEW ... WITH METRICS LANGUAGE YAML AS e inserisci la definizione tra i delimitatori $$:

CREATE OR REPLACE VIEW catalog.schema.rolling_customers WITH METRICS LANGUAGE YAML AS
$$
  version: 1.1

  source: samples.tpch.orders
  filter: o_orderdate > DATE'1998-01-01'

  fields:
    - name: date
      expr: o_orderdate

  measures:
    - name: t7d_customers
      expr: COUNT(DISTINCT o_custkey)
      window:
        - order: date
          range: trailing 7 day
          semiadditive: last
$$

Le altre definizioni complete in questa pagina seguono lo stesso modello.

Esempio di misura della finestra periodo su periodo

Nell'esempio seguente viene calcolata la crescita delle vendite giornaliere confrontando i ricavi odierni (somma di tutti i prezzi degli ordini) con i ricavi di ieri. Questa metrica identifica le tendenze di vendita giornaliere e mostra la variazione percentuale dei ricavi.

version: 1.1

source: samples.tpch.orders
filter: o_orderdate > DATE'1998-01-01'

fields:
  - name: date
    expr: o_orderdate
measures:
  - name: previous_day_sales
    expr: SUM(o_totalprice)
    window:
      - order: date
        range: trailing 1 day
        semiadditive: last
  - name: current_day_sales
    expr: SUM(o_totalprice)
    window:
      - order: date
        range: current
        semiadditive: last
  - name: day_over_day_growth
    expr: (MEASURE(current_day_sales) - MEASURE(previous_day_sales)) / MEASURE(previous_day_sales) * 100

Per questo esempio, si applica la configurazione seguente:

  • Nell'esempio vengono utilizzate due misure finestra: una per calcolare le vendite totali nel giorno precedente e una per il giorno corrente.
  • Una terza misura calcola la variazione percentuale (crescita) tra i giorni correnti e precedenti.

Esempio di misura finestra anno su anno usando offset

Il modificatore offset è l'elemento costitutivo per le misure di confronto tra periodi. Definire una copia spostata di una misura di base, quindi comporre i due per esprimere delta, rapporti o tassi di crescita direttamente nella visualizzazione delle metriche.

Nell'esempio seguente viene calcolata la crescita delle vendite dell'anno oltre l'anno confrontando le vendite di ogni mese con lo stesso mese nell'anno precedente. La misura spostata usa offset: -12 month per guardare indietro di 12 mesi lungo il month campo.

version: 1.1
source: main.default.monthly_sales

fields:
  - name: month
    expr: month
  - name: category
    expr: category

measures:
  - name: monthly_sales
    expr: SUM(sales)
    window:
      - order: month
        range: current
        semiadditive: last

  - name: monthly_sales_py
    expr: SUM(sales)
    window:
      - order: month
        range: current
        semiadditive: last
        offset: -12 month

  - name: yoy_growth
    expr: MEASURE(monthly_sales) - MEASURE(monthly_sales_py)

  - name: yoy_growth_pct
    expr: (MEASURE(monthly_sales) - MEASURE(monthly_sales_py))
      / NULLIF(MEASURE(monthly_sales_py), 0)

Per questo esempio, si applica la configurazione seguente:

  • monthly_sales è la misura di base, sommando le vendite per il mese corrente.
  • monthly_sales_py è la stessa misura spostata indietro di 12 mesi usando offset: -12 month. Per gennaio 2025, restituisce il valore per gennaio 2024.
  • yoy_growth e yoy_growth_pct comporre le due misure per esprimere la variazione assoluta e percentuale. L'uso di NULLIF evita errori di divisione per zero quando il valore dell'anno precedente è zero.

La finestra misura su una colonna numerica di indice

Richiede Databricks Runtime 19 o superiore e specifica YAML versione 1.1 o superiore.

Un offset basato sulla data, come -12 month, procede lungo una colonna data o timestamp. Una colonna di data non si adatta più quando il tuo asse di confronto è un periodo aziendale che non è una data di calendario. Settimane fiscali, settimane ISO e periodi contabili 4-4-5 sono tutti esempi. Invece, ordina una misura di finestra in base a una colonna di indice intera e applica un valore numerico offset senza unità o range. Uno spostamento numerico esegue operazioni aritmetiche intere sull'indice, quindi offset: -1 indica la posizione precedente nella sequenza e range: trailing 3 indica le ultime tre posizioni della sequenza.

Un offset numerico o un intervallo restituisce il risultato corretto solo quando la order colonna soddisfa tutti i seguenti requisiti. Solo il primo requisito viene convalidato al momento della richiesta. Una colonna che rompe una delle altre due restituisce numeri sbagliati invece di un errore, quindi verificali tu stesso:

  • Integrale: La colonna è un TINYINT, SMALLINT, INT, o BIGINT. DATE, TIMESTAMP, DECIMAL, DOUBLE, e STRING colonne non sono colonne indice valide. Per eseguire un confronto in base a una data, usa invece un offset datato. Vedere Come offset sposta la cornice della finestra.
  • Monotonico e consecutivo (denso): Il valore aumenta esattamente di 1 da ogni periodo reale al successivo, incluso lungo il confine annuale o trimestrale. Un'interruzione o un valore ripetuto fa sì che offset: -1 salti o conteggi due volte un periodo. Un'etichetta grezza, come una fiscal_week che si resetta a 1 ogni anno, non è un indice valido di per sé.
  • Abbinato alla grana di confronto: lo spostamento o i gradini di intervallo nella grana dell'indice. Su un indice mensile, offset: -1 è il mese precedente e range: trailing 3 rappresenta gli ultimi tre mesi. Per un confronto più grossolano, come anno su anno, ordina una misura separata su un indice annuale o usa una misura della stessa posizione del ciclo precedente. Non riutilizzare un indice più fine (mensile) e non raggruppare in gruppi più precisi. Vedi Stessa posizione in un ciclo precedente (due specifiche di finestre, senza indice).

Ottieni una colonna indice

Puoi nominare una colonna indice pre-calcolata dalla sorgente, oppure derivarne una nella vista metrica. La ricetta dipende dalla forma del calendario:

Forma del calendario Ricetta di indicizzazione
Periodi uniformi per genitore (12 mesi all'anno, 4 trimestri all'anno) expr: year * 12 + month (mesi) o expr: year * 4 + quarter (quarti). Questo è esatto e non richiede tavolo aggiuntivo.
Periodi variabili per genitore (ISO 52- o 53 settimane, 4-4-5 a grano settimanale) Usa una tabella di ricerca del calendario che corrisponda (year, period) a un intero denso. Una deriva ingenua year * 53 + week su anni di 52 settimane.
Tasto delle corde ('YYYYPP', 'YYYY-Www') Analizza prima la stringa agli interi, poi applica una delle ricette sopra.

Allinea le dimensioni da cui dipende l'indice

Assegna una range: all specifica di ordinamento a ogni campo della vista metrica da cui viene calcolato l'indice, ad esempio order_year e order_month per month_index = order_year * 12 + order_month. Questo vale sia che l'indice sia derivato nella vista metrica sia precalcolato a monte come colonna nuda. La range: all specifica fa sì che quei campi vengano ignorati durante la costruzione della finestra, come previsto, quando una query li raggruppa o filtra su di essi.

Queste specifiche non sono opzionali. Senza di essi, una query che raggruppa per order_year o order_month partiziona la finestra in base a quei campi, confinando così il frame spostato a un singolo periodo, e la misura di confronto risulta NULL.

Ogni altro campo non ha alcuna range: all specifica. Un campo indipendente dall'indice, come region, viene raggruppato normalmente e la finestra viene partizionata per valore.

Confronto consecutivo o finestra mobile (indice più intervallo numerico)

Usa un indice con un offset numerico o un intervallo quando intendi "adiacente nella sequenza", ad esempio il periodo precedente, gli ultimi N periodi o il periodo da inizio periodo a oggi. Ordina in base all'indice, applica un offset numerico o un intervallo e aggiungi una specifica range: all per ogni colonna del calendario da cui l'indice dipende. Nel seguente esempio, l'indice dipende da order_year e order_month:

version: 1.1
source: samples.tpch.orders

fields:
  - name: order_year
    expr: YEAR(o_orderdate) # INT breakdown column
  - name: order_month
    expr: MONTH(o_orderdate) # INT breakdown column
  - name: month_index # consecutive monotonic index across years
    expr: order_year * 12 + order_month

measures:
  - name: monthly_sales
    expr: SUM(o_totalprice)
    window:
      - order: order_year # breakdown, so range: all keeps GROUP BY order_year working
        range: all
        semiadditive: last
      - order: order_month # breakdown
        range: all
        semiadditive: last
      - order: month_index # the axis you compare along
        range: current
        semiadditive: last

  - name: monthly_sales_prev # previous month: same specs plus a unitless offset of -1 on the index
    expr: SUM(o_totalprice)
    window:
      - order: order_year
        range: all
        semiadditive: last
      - order: order_month
        range: all
        semiadditive: last
      - order: month_index
        range: current
        offset: -1 # one position back, crosses the year boundary correctly
        semiadditive: last

  - name: sales_trailing_3mo # rolling 3 months: unitless range on the index
    expr: SUM(o_totalprice)
    window:
      - order: order_year
        range: all
        semiadditive: last
      - order: order_month
        range: all
        semiadditive: last
      - order: month_index
        range: trailing 3 # the three index positions before the current month
        semiadditive: last

  - name: mom_pct_change
    expr: (MEASURE(monthly_sales) - MEASURE(monthly_sales_prev))
      / NULLIF(MEASURE(monthly_sales_prev), 0) * 100

Per questo esempio, si applica la configurazione seguente:

  • month_index è un indice monotono consecutivo che aumenta di 1 ogni mese attraverso i confini annuali.
  • monthly_sales ordina in base all'indice con range: current e assegna alle colonne di suddivisione order_year e order_month una specifica range: all in modo che il raggruppamento in base a esse funzioni.
  • monthly_sales_prev Aggiunge offset: -1 l'indice per guardare indietro di un mese, che attraversa correttamente il confine annuale.
  • sales_trailing_3mo Utilizza l'intervallo trailing 3 senza unità per sommare tre posizioni indicizzate. Poiché l'indice è consecutivo, tre posizioni corrispondono a tre mesi, senza coinvolgere l'aritmetica delle unità di tempo. Questo presuppone che ogni mese nell'intervallo abbia una riga sorgente. Se manca un mese, la finestra non si allinea più in modo netto a tre mesi di calendario, quindi densifica i dati di origine fino a ottenere un insieme completo di periodi quando sono possibili lacune. L'intervallo predefinito è exclusive, quindi copre i tre mesi precedenti a quello attuale. Aggiungi inclusive per includere il mese corrente invece.
  • mom_pct_change compone le misure base e spostate. L'uso NULLIF evita errori di divisione per zero quando il valore precedente è zero.

Interroga la misura raggruppando in base alle colonne di ripartizione allineate, non all'indice non elaborato:

SELECT
  order_year,
  order_month,
  MEASURE(monthly_sales),
  MEASURE(monthly_sales_prev),
  MEASURE(sales_trailing_3mo),
  MEASURE(mom_pct_change)
FROM catalog.schema.monthly_sales_mv
GROUP BY ALL

Stessa posizione in un ciclo precedente (due specifiche di finestre, nessun indice)

Un confronto come "lo stesso mese dell'anno scorso" è allineato per posizione, non per distanza assoluta, quindi non ha bisogno di una colonna indice. Usa due specifiche della finestra: una sposta il ciclo padre e l'altra mantiene la posizione interna.

version: 1.1
source: samples.tpch.orders

fields:
  - name: order_year
    expr: YEAR(o_orderdate)
  - name: order_month
    expr: MONTH(o_orderdate)

measures:
  - name: monthly_sales
    expr: SUM(o_totalprice)

  - name: monthly_sales_py # same month, prior year
    expr: SUM(o_totalprice)
    window:
      - order: order_year # shift the year coordinate
        range: current
        offset: -1
        semiadditive: last
      - order: order_month # hold the month fixed
        range: current
        semiadditive: last

  - name: yoy_pct_change
    expr: (MEASURE(monthly_sales) - MEASURE(monthly_sales_py))
      / NULLIF(MEASURE(monthly_sales_py), 0) * 100

Per questo esempio, si applica la configurazione seguente:

  • monthly_sales_py Usa due specifiche di finestra. La order_year specifica sposta la coordinata annuale indietro di uno con offset: -1, e la order_month specifica mantiene il mese fisso con range: current.
  • Il confronto si allinea per posizione, quindi non ha bisogno di una colonna indice.
  • yoy_pct_change compone le due misure per esprimere la variazione percentuale.

Esempio di misura totale cumulativa (in esecuzione)

Nell'esempio seguente vengono calcolati i ricavi cumulativi delle vendite dall'inizio del set di dati fino a ogni data. Questo totale in esecuzione mostra la quantità di ricavi totali generati nel tempo, utile per tenere traccia dello stato di avanzamento verso obiettivi di ricavi annuali o analizzare i modelli di crescita a lungo termine.

version: 1.1
source: samples.tpch.orders

filter: o_orderdate > DATE'1998-01-01'

fields:
  - name: date
    expr: o_orderdate
  - name: customer
    expr: o_custkey

measures:
  - name: running_total_sales
    expr: SUM(o_totalprice)
    window:
      - order: date
        range: cumulative
        semiadditive: last

Per questo esempio, si applica la configurazione seguente:

  • order: date ordina cronologicamente la finestra.
  • range: cumulative definisce la finestra come tutti i dati dall'inizio del dataset fino a ciascuna data inclusa.
  • semiadditive: last restituisce il valore cumulativo più recente quando date non è incluso nell'GROUP BY della query, anziché sommarlo su tutte le date.

Esempio di misura da inizio periodo a oggi

Nell'esempio seguente vengono calcolati i ricavi delle vendite da inizio anno (YTD). Questa misura mostra i ricavi cumulativi generati dal 1° gennaio di ogni anno fino alla data corrente, reimpostando all'inizio di ogni nuovo anno.

version: 1.1

source: samples.tpch.orders
filter: o_orderdate > DATE'1997-01-01'

fields:
  - name: date
    expr: o_orderdate
  - name: month
    expr: DATE_TRUNC('MONTH', date)
  - name: year
    expr: DATE_TRUNC('year', date)
measures:
  - name: ytd_sales
    expr: SUM(o_totalprice)
    window:
      - order: date
        range: cumulative
        semiadditive: last
      - order: year
        range: current
        semiadditive: last

Per questo esempio, si applica la configurazione seguente:

  • Nell'esempio vengono utilizzate due specifiche della finestra: una per la somma cumulativa sul date campo e un'altra per limitare la somma all'anno current .
  • Il year campo limita la somma cumulativa in modo che venga reimpostata all'inizio di ogni nuovo anno.
  • I campi month e year formano una gerarchia di date sul campo ordine date: ciascuno è definito nel campo date in base al nome, non sulla colonna sottostante o_orderdate, in modo che le query possano raggruppare questa misura in base a essi. Vedere Raggruppare per un campo gerarchia di date.

Esempio di misura semiadditiva

L'esempio seguente calcola i saldi del conto, che non devono essere sommati tra le date (non è possibile aggiungere il saldo di lunedì al saldo di martedì per ottenere il saldo totale). Al contrario, quando si aggrega tra più giorni, la misura restituisce il saldo più recente. Tuttavia, la misura può comunque essere sommata tra i clienti per mostrare il saldo totale in tutti i conti in un determinato giorno.

version: 1.1

fields:
  - name: date
    expr: date
  - name: customer
    expr: customer_id

measures:
  - name: semiadditive_balance
    expr: SUM(balance)
    window:
      - order: date
        range: current
        semiadditive: last

Per questo esempio, si applica la configurazione seguente:

  • order: date ordina cronologicamente la finestra.
  • range: current limita la finestra a un singolo giorno senza aggregazioni tra giorni.
  • semiadditive: last restituisce il saldo più recente durante l'aggregazione in più giorni.

Annotazioni

Questa misura temporale somma tutti i clienti per ottenere il saldo complessivo giornaliero.

Interrogare una misura della finestra

È possibile eseguire query su una visualizzazione metrica con una misura della finestra come qualsiasi altra visualizzazione metrica. Una misura di finestra viene calcolata in base al campo order, quindi una query che suddivide i risultati nel tempo deve fare riferimento a quel campo, direttamente oppure tramite un campo di gerarchia delle date definito su di esso. Quando la query non fa riferimento al campo order, la semiadditive parola chiave determina il valore restituito, come descritto in Esempio di misura semiadditive.

L'esempio seguente raggruppa una misura di finestra per state e per un'espressione mensile sul campo order date:

SELECT
   state,
   DATE_TRUNC('month', date),
   MEASURE(t7d_customers) as m
FROM my_metric_view
WHERE date >= DATE'2024-06-01'
GROUP BY ALL

Raggruppare in base a un campo della gerarchia di date

Una gerarchia di date raggruppa il campo a livelli di granularità più elevati, ad esempio alla settimana, al mese o all'anno. Definire ogni livello come un campo sul campo di ordinamento per nome, non sulla colonna di origine sottostante:

fields:
  - name: date
    expr: o_orderdate
  # Date hierarchy: each level is defined on the order field `date`,
  # not on the underlying o_orderdate column.
  - name: month
    expr: DATE_TRUNC('MONTH', date)
  - name: year
    expr: DATE_TRUNC('year', date)

Il raggruppamento di una misura della finestra in base a un livello di gerarchia restituisce la misura in corrispondenza di tale granularità. Supponendo che l'esempio period-to-date venga creato come ytd_metric_view, come nell'esempio di misura period-to-date, la query seguente restituisce il valore YTD alla data dell'ultimo giorno di ciascun mese:

SELECT month, MEASURE(ytd_sales) AS ytd_sales
FROM ytd_metric_view
GROUP BY month
ORDER BY month;

Avvertimento

La definizione di un livello di gerarchia nella colonna di origine sottostante, ad esempio DATE_TRUNC('MONTH', o_orderdate), interrompe il collegamento al campo datedell'ordine , anche se le espressioni hanno un aspetto equivalente. Il raggruppamento di una misura della finestra in base a un campo di questo tipo restituisce risultati non corretti.

Componibilità

Le visualizzazioni delle metriche sono componibili. È possibile creare nuovi campi e misure che fanno riferimento a quelli esistenti anziché riscrivere la logica da zero. In questo modo si riduce la duplicazione e si semplifica la gestione delle definizioni delle metriche complesse.

La componibilità funziona a due livelli: all'interno di una singola visualizzazione metrica e tra le visualizzazioni delle metriche quando una vista metrica viene usata come origine per un'altra.

La componibilità supporta i modelli di riferimento seguenti:

  • Campi precedenti in nuovi campi.
  • Campi e misure precedenti nelle nuove misure.
  • Campi delle viste metriche utilizzati come origine nei nuovi campi.
  • Campi e misure dalle visualizzazioni delle metriche usate come origine nelle nuove misure.

Definire misure con componibilità

measures Nella sezione è possibile fare riferimento a misure dalla vista metrica di origine o dalle misure definite in precedenza nella stessa vista metrica. Questo approccio migliora coerenza, controllabilità e manutenzione del livello semantico.

Tipo di misura Description Example
Atomica Aggregazione semplice e diretta in una colonna di origine. Questi formano i blocchi predefiniti. SUM(o_totalprice)
Composto Espressione che combina matematicamente una o più altre misure usando la MEASURE() funzione . MEASURE(total_revenue) / MEASURE(order_count)

Esempio: Valore dell'ordine medio (AOV)

Nell'esempio seguente viene definito il valore medio dell'ordine (AOV) usando due misure atomico: total_revenue (somma dei prezzi degli ordini) e order_count (numero di ordini). La avg_order_value misura fa riferimento a entrambe le misure atomiche.

version: 1.1

source: samples.tpch.orders

measures:
  # Total Revenue
  - name: total_revenue
    expr: SUM(o_totalprice)

  # Order Count
  - name: order_count
    expr: COUNT(1)

  # Composed Measure: Average Order Value (AOV)
  - name: avg_order_value
    # Defines AOV as Total Revenue divided by Order Count
    expr: MEASURE(total_revenue) / MEASURE(order_count)

Se la total_revenue definizione cambia (ad esempio, per escludere l'imposta), avg_order_value usa automaticamente la definizione aggiornata.

Componibilità con la logica condizionale

È possibile usare la componibilità per creare rapporti complessi, percentuali condizionali e tassi di crescita senza basarsi sulle funzioni finestra per semplici calcoli di periodi nel corso del periodo.

Esempio: Tasso di evasione

Nell'esempio seguente viene calcolato il tasso di evasione: la percentuale di ordini con stato 'F' (evaso). La misura divide gli ordini evasi per gli ordini totali.

version: 1.1

source: samples.tpch.orders

measures:
  # Total Orders (denominator)
  - name: total_orders
    expr: COUNT(1)

  # Fulfilled Orders (numerator)
  - name: fulfilled_orders
    expr: COUNT(1) FILTER (WHERE o_orderstatus = 'F')

  # Composed Measure: Fulfillment Rate (Ratio)
  - name: fulfillment_rate
    expr: MEASURE(fulfilled_orders) / MEASURE(total_orders)
    format:
      type: percentage

Procedure consigliate per la componibilità

  1. Definire prima le misure atomico: stabilire misure fondamentali (SUM, COUNT, AVG) prima di definire misure che vi fanno riferimento.
  2. Usare MEASURE() per i riferimenti: usare la MEASURE() funzione quando si fa riferimento a un'altra misura in un oggetto expr. Non ripetere manualmente la logica di aggregazione. Ad esempio, evitare SUM(a) / COUNT(b) se esistono misure per entrambi i valori.
  3. Classificare in ordine di priorità la leggibilità: comporre misure usando formule matematiche chiare. Ad esempio, MEASURE(gross_profit) / MEASURE(total_revenue) è più chiaro di una singola espressione SQL complessa.
  4. Aggiungere metadati semantici: usare metadati semantici per formattare misure composte (ad esempio, percentuali o valuta) per gli strumenti downstream. Vedere Metadati dell'agente nelle visualizzazioni delle metriche.

Risorse aggiuntive