Geavanceerde technieken voor metrische weergaven

Met geavanceerde technieken voor metrische weergaven kunt u complexe bedrijfslogica uitdrukken en definities opnieuw gebruiken in uw semantische laag. Op deze pagina worden twee van deze technieken uitgelegd:

  • Venstermetingen: voor berekeningen van tijdreeksen, zoals zwevende gemiddelden, lopende totalen en wijzigingen in periode-over-periode.
  • Samenstelbaarheid: voor het bouwen van complexe metingen door te verwijzen naar andere metingen in plaats van hun logica te herschrijven.

Op deze pagina wordt ervan uitgegaan dat u bekend bent met basisconcepten voor het modelleren van metrische gegevens. Zie modelmetrische weergaven.

Note

In de voorbeelden op deze pagina wordt gebruikgemaakt van de TPC-H voorbeeldgegevensset, die een groothandelsketen modellt. Zie tpch voor meer informatie over de TPC-H gegevensset. Voor een end-to-end zelfstudie met behulp van deze gegevensset met metrische weergaven raadpleegt u Zelfstudie: een metrische weergave bouwen met joins en gegevensmodellering.

Venstermetingen

Met venstermetingen kunt u metingen definiëren met gevensterde, cumulatieve of semi-aangrenzende aggregaties in uw metrische weergaven. Ze ondersteunen berekeningen zoals zwevende gemiddelden, wijzigingen in perioden en lopende totalen.

U kunt een venstermeting toevoegen in de Catalogusverkenner-editor of in YAML.

Een venstermeting toevoegen in de editor

Klik op het tabblad UI van de editor voor metrische weergave op + Venster tijdens het bewerken van een meting. + Window is beschikbaar in zowel de modus Builder als de modus Custom. De vensteropties in de editor komen overeen met de YAML-velden die worden beschreven in Een venstermeting definiëren.

Zie Een metrische weergave maken voor meer informatie over het maken en bewerken van metingen.

Een venstermeting definiëren

Een venstermeting bevat de volgende vereiste velden:

  • order: Het veld dat de volgorde van het venster bepaalt.

  • bereik: Definieert de omvang van het venster. Ondersteunde waarden zijn onder andere current, cumulative, trailing, leadingen all. Zie Ondersteunde range waarden voor volledige syntaxis en beschrijvingen. Zie inclusive voor meer informatie over de exclusive en trailing modificaties op leading en .

  • semiadditive: hiermee geeft u op hoe de meting moet worden samengevoegd wanneer het orderveld niet is opgenomen in de query GROUP BY. Mogelijke waarden: first en last.

Een venstermeting ondersteunt ook het volgende optionele veld:

  • offset: Hiermee verschuift u het vensterkader achteruit of vooruit langs het order veld met een vast interval. Gebruik dit voor period-over-periode-metingen, zoals maand-op-maand of jaar-over-jaar. Zie Venstermetingen voor syntaxis, ondersteunde eenheden en beperkingen.

Je kunt ook naar een geheelgetalparameter verwijzen als de waarde van de range of offset van een venstermaat, zodat de aanroepende code de venstergrootte tijdens het uitvoeren van de query doorgeeft. Zie Geef een venstergrootte door als parameter.

Hoe offset het vensterframe wordt verplaatst

Zie beschikbaarheid van de functie voor metrische gegevens voor minimale versievereisten voor berekeningen en YAML-specificatie.

Het veld range definieert de vorm van het venster ten opzichte van de ankerregel, en offset schuift dat frame met het opgegeven interval langs order. De volgende tabel toont het frame voor elke range-waarde met en zonder een offset van k, ten opzichte van de ankerregel t:

range Frame zonder verschuiving Frame met 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 volledige partitie volledige partitie (ongewijzigd)

offset is onafhankelijk van semiadditive. De first of last keuze bepaalt nog steeds hoe de meting samenvalt wanneer order deze zich niet in de query bevindt GROUP BY.

Voor het beste resultaat stemt u offset af op de natuurlijke nerf van order. Voor maandelijkse gegevens heeft offset: -12 month de voorkeur boven offset: -365 day, omdat bij berekeningen met maanden en jaren rekening wordt gehouden met maanden van variabele lengte en met schrikkeljaren, terwijl dat bij day-berekeningen niet het geval is.

De ankerrij opnemen of uitsluiten

Zie beschikbaarheid van de functie voor metrische gegevens voor minimale versievereisten voor berekeningen en YAML-specificatie.

Voor de bereiken trailing en leading bepaalt het optionele trefwoord inclusive of exclusive of de vensterwaarde van de ankerregel (bijvoorbeeld vandaag) deel uitmaakt van het rollende venster:

Keyword Meaning Ankerrij in bereik?
inclusive n eenheden , inclusief de ankerrij. Ja
exclusive (standaard) n eenheden niet inclusief de ankerrij. Nee.

In het volgende voorbeeld ziet u hoe inclusive en exclusive van invloed zijn op het lopende venster voor de ankerdatum 2025-01-05 met trailing 3 day.

Stel dat de onderliggende gegevens één rij per dag hebben met de volgende waarden:

Datum Value
2025-01-02 1
2025-01-03 4
2025-01-04 2
2025-01-05 (anker) 5

Elke modifier selecteert de rijen van drie dagen ten opzichte van het anker en telt de waarden daarvan op:

Aanpasser Datums in het venster Values Som
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 intervallen volgen dezelfde logica in omgekeerde richting.

Voorbeeld van volg-, bewegende of voorloopvenstermeting

In het volgende voorbeeld wordt een doorlopende telling van 7 dagen berekend van klanten die orders hebben geplaatst. Met deze metrische gegevens worden trends in klantbetrokkenheid in de loop van de tijd bijgehouden door aan te geven hoeveel afzonderlijke klanten in de week tot elke datum hebben gekocht.

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

In dit voorbeeld is de volgende configuratie van toepassing:

  • order: date geeft aan dat het venster door het date veld wordt georden.
  • range: trailing 7 day definieert het venster als de 7 dagen vóór elke datum, met uitzondering van de datum zelf.
  • semiadditive: last retourneert de laatste waarde in het venster van 7 dagen wanneer date dit geen groeperingskolom is.
De metrische weergave maken met behulp van SQL

Als u deze metrische weergave buiten Catalog Explorer wilt maken, verpakt u de YAML in CREATE OR REPLACE VIEW ... WITH METRICS LANGUAGE YAML AS en plaatst u de definitie tussen de $$ scheidingstekens:

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
$$

De andere volledige definities op deze pagina volgen hetzelfde patroon.

Voorbeeld van venstermaatregel voor periode-tot-periode

In het volgende voorbeeld wordt de groei van de dagelijkse verkoop berekend door de omzet van vandaag (som van alle orderprijzen) te vergelijken met de omzet van gisteren. Deze metrische waarde identificeert dagelijkse verkooptrends en toont de procentuele verandering in omzet.

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

In dit voorbeeld is de volgende configuratie van toepassing:

  • In het voorbeeld worden twee venstermetingen gebruikt: één voor het berekenen van de totale verkoop op de vorige dag en één voor de huidige dag.
  • Met een derde meting wordt de percentagewijziging (groei) tussen de huidige en vorige dagen berekend.

Voorbeeld van meting van jaar-op-jaar-venster met behulp van offset

De offset modifier is de basis voor periode-op-periode-metingen. Definieer een verschoven kopie van een basismeting en stel vervolgens de twee samen om verschillen, verhoudingen of groeipercentages rechtstreeks in de metrische weergave uit te drukken.

In het volgende voorbeeld wordt de jaarlijkse omzetgroei berekend door de verkoop van elke maand te vergelijken met dezelfde maand in het voorgaande jaar. De verschoven meting gebruikt offset: -12 month om 12 maanden terug te kijken op het month veld.

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)

In dit voorbeeld is de volgende configuratie van toepassing:

  • monthly_sales is de basismeting, die de verkoop voor de huidige maand optelt.
  • monthly_sales_py is dezelfde meting, 12 maanden teruggeschoven met behulp van offset: -12 month. Voor januari 2025 wordt de waarde voor januari 2024 geretourneerd.
  • yoy_growth en yoy_growth_pct stel de twee metingen samen om de absolute en procentuele wijziging uit te drukken. Door NULLIF te gebruiken, voorkomt u deel-door-nulfouten wanneer de waarde van het voorgaande jaar nul is.

Voorbeeld van een cumulatieve (lopende) totaalmeting

In het volgende voorbeeld wordt de cumulatieve omzet berekend vanaf het begin van de gegevensset tot elke datum. Dit lopende totaal laat zien hoeveel totale omzet er in de loop van de tijd is gegenereerd, wat nuttig is voor het bijhouden van de voortgang van de jaarlijkse omzetdoelen of het analyseren van groeipatronen op lange termijn.

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

In dit voorbeeld is de volgende configuratie van toepassing:

  • order: date sorteert het venster chronologisch.
  • range: cumulative definieert het venster als alle gegevens vanaf het begin van de gegevensset tot en met elke datum.
  • semiadditive: last retourneert de meest recente cumulatieve waarde wanneer date deze niet is opgenomen in de query GROUP BY, in plaats van op te sommen voor alle datums.

Voorbeeld van meting voor periode tot heden

In het volgende voorbeeld wordt de omzet van jaar tot heden (YTD) berekend. Deze meting toont de cumulatieve omzet die is gegenereerd vanaf 1 januari van elk jaar tot aan de huidige datum, die aan het begin van elk nieuw jaar opnieuw wordt ingesteld.

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

In dit voorbeeld is de volgende configuratie van toepassing:

  • In het voorbeeld worden twee vensterspecificaties gebruikt: een voor de cumulatieve som van het date veld en een andere om de som tot het current jaar te beperken.
  • Het year veld beperkt de cumulatieve som zodat deze aan het begin van elk nieuw jaar opnieuw wordt ingesteld.
  • De velden month en year vormen een datumhiërarchie op het orderveld date: elk daarvan wordt op naam gedefinieerd op het veld date, niet op de onderliggende kolom o_orderdate, zodat query's deze maatstaf op basis daarvan kunnen groeperen. Zie Groeperen op een datumhiërarchieveld.

Voorbeeld van semi-additieve maatregel

In het volgende voorbeeld worden rekeningsaldi berekend, die niet mogen worden opgeteld bij datums (u kunt het saldo van maandag niet toevoegen aan het saldo van dinsdag om het totale saldo op te halen). In plaats daarvan retourneert de meting bij het samenvoegen van meerdere dagen het meest recente saldo. De meting kan echter nog steeds worden opgeteld voor klanten om het totale saldo voor alle accounts op een bepaalde dag weer te geven.

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

In dit voorbeeld is de volgende configuratie van toepassing:

  • order: date sorteert het venster chronologisch.
  • range: current beperkt het venster tot één dag zonder aggregatie over dagen.
  • semiadditive: last retourneert het meest recente saldo bij het samenvoegen van meerdere dagen.

Note

Deze meting binnen het tijdsvenster somt nog steeds op voor alle klanten om het totale dagelijkse saldo te verkrijgen.

Een query uitvoeren op een venstermeting

U kunt een query uitvoeren op een metrische weergave met een venstermeting zoals elke andere metrische weergave. Een venstermeting wordt berekend in het order veld, dus een query die de resultaten in de loop van de tijd opsplitst, moet verwijzen naar dat veld, rechtstreeks of via een datumhiërarchieveld dat erop is gedefinieerd. Wanneer de query niet verwijst naar het orderveld, bepaalt het semiadditive trefwoord de geretourneerde waarde, zoals beschreven in het voorbeeld van een semiadditive-meting.

In het volgende voorbeeld wordt een windowmaat gegroepeerd op state en op basis van een maandexpressie over het orderveld 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

Groeperen op basis van een veld voor datumhiërarchie

Met een datumhiërarchie wordt het volgordeveld samengevoegd naar een grover granulariteitsniveau, zoals week, maand of jaar. Definieer elk niveau als een veld op basis van de naam van het orderveld, niet op basis van de onderliggende bronkolom:

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)

Als u een venstermaat per hiërarchieniveau groepeert, krijgt u de maat op dat granulariteitsniveau terug. Ervan uitgaande dat het periode-tot-datumvoorbeeld wordt gemaakt als ytd_metric_view, zoals in het voorbeeld van de maatstaf Periode-tot-datum, retourneert de volgende query de YTD-waarde per de laatste datum van elke maand:

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

Warning

Het definiëren van een hiërarchieniveau op de onderliggende bronkolom, zoals DATE_TRUNC('MONTH', o_orderdate), breekt de koppeling naar het orderveld dateop, zelfs als de expressies er equivalent uitzien. Als u een venstermeting groepeert op een dergelijk veld, worden onjuiste resultaten geretourneerd.

Modulariteit

Metrische weergaven zijn samenstelbaar. U kunt nieuwe velden en metingen maken die verwijzen naar bestaande velden in plaats van logica helemaal opnieuw te schrijven. Dit vermindert duplicatie en maakt complexe metrische definities gemakkelijker te onderhouden.

Samenstelbaarheid werkt op twee niveaus: binnen één metriekweergave en tussen metriekweergaven wanneer één metriekweergave als bron voor een andere wordt gebruikt.

Composability ondersteunt de volgende referentiepatronen:

  • Vorige velden in nieuwe velden.
  • Velden en eerdere meetwaarden in nieuwe meetwaarden.
  • Velden uit metrische weergaven die worden gebruikt als bron in nieuwe velden.
  • Velden en maatstaven uit metriekweergaven die als bron voor nieuwe maatstaven worden gebruikt.

Metingen definiëren met composabiliteit

In de measures sectie kunt u verwijzen naar metingen uit de metrische bronweergave of metingen die eerder in dezelfde metrische weergave zijn gedefinieerd. Deze aanpak verbetert de consistentie, controlebaarheid en het onderhoud van uw semantische laag.

Type meetwaarde Description Voorbeeld
Atomic Een eenvoudige, directe aggregatie op een bronkolom. Deze vormen de bouwstenen. SUM(o_totalprice)
Samengesteld uit Een expressie die een of meer andere metingen wiskundig combineert met behulp van de MEASURE() functie. MEASURE(total_revenue) / MEASURE(order_count)

Voorbeeld: Gemiddelde orderwaarde (AOV)

In het volgende voorbeeld wordt de gemiddelde orderwaarde (AOV) gedefinieerd met behulp van twee atomische metingen: total_revenue (som van orderprijzen) en order_count (aantal orders). De avg_order_value meting verwijst naar beide atomische metingen.

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)

Als de total_revenue definitie verandert (bijvoorbeeld om belasting uit te sluiten), avg_order_value wordt automatisch de bijgewerkte definitie gebruikt.

Composabiliteit met voorwaardelijke logica

U kunt samenstelbaarheid gebruiken om complexe verhoudingen, voorwaardelijke percentages en groeipercentages te maken zonder gebruik te maken van vensterfuncties voor eenvoudige berekeningen voor period-over-perioden.

Voorbeeld: Uitvoeringspercentage

In het volgende voorbeeld wordt het uitvoeringspercentage berekend: het percentage orders met de status 'F' (voldaan). De meting verdeelt voltooide orders per totaal aantal orders.

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

Best practices voor samenstelbaarheid

  1. Definieer eerst atomische metingen: Stel fundamentele metingen (SUM, COUNT, AVG) vast voordat u metingen definieert die ernaar verwijzen.
  2. Gebruiken MEASURE() voor verwijzingen: Gebruik de MEASURE() functie bij het verwijzen naar een andere meting in een expr. Herhaal aggregatielogica niet handmatig. Vermijd SUM(a) / COUNT(b) bijvoorbeeld of er al metingen voor beide waarden bestaan.
  3. Prioriteit geven aan leesbaarheid: metingen opstellen met behulp van duidelijke wiskundige formules. Is bijvoorbeeld MEASURE(gross_profit) / MEASURE(total_revenue) duidelijker dan één complexe SQL-expressie.
  4. Voeg semantische metagegevens toe: gebruik semantische metagegevens om samengestelde metingen (bijvoorbeeld percentages of valuta) op te maken voor downstreamhulpprogramma's. Zie metagegevens van agent in metrische weergaven.

Aanvullende informatiebronnen