Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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,leadingenall. Zie Ondersteunderangewaarden voor volledige syntaxis en beschrijvingen. Zieinclusivevoor meer informatie over deexclusiveentrailingmodificaties opleadingen .semiadditive: hiermee geeft u op hoe de meting moet worden samengevoegd wanneer het orderveld niet is opgenomen in de query
GROUP BY. Mogelijke waarden:firstenlast.
Een venstermeting ondersteunt ook het volgende optionele veld:
-
offset: Hiermee verschuift u het vensterkader achteruit of vooruit langs het
orderveld 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: dategeeft aan dat het venster door hetdateveld wordt georden. -
range: trailing 7 daydefinieert het venster als de 7 dagen vóór elke datum, met uitzondering van de datum zelf. -
semiadditive: lastretourneert de laatste waarde in het venster van 7 dagen wanneerdatedit 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_salesis de basismeting, die de verkoop voor de huidige maand optelt. -
monthly_sales_pyis dezelfde meting, 12 maanden teruggeschoven met behulp vanoffset: -12 month. Voor januari 2025 wordt de waarde voor januari 2024 geretourneerd. -
yoy_growthenyoy_growth_pctstel de twee metingen samen om de absolute en procentuele wijziging uit te drukken. DoorNULLIFte 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: datesorteert het venster chronologisch. -
range: cumulativedefinieert het venster als alle gegevens vanaf het begin van de gegevensset tot en met elke datum. -
semiadditive: lastretourneert de meest recente cumulatieve waarde wanneerdatedeze niet is opgenomen in de queryGROUP 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
dateveld en een andere om de som tot hetcurrentjaar te beperken. - Het
yearveld beperkt de cumulatieve som zodat deze aan het begin van elk nieuw jaar opnieuw wordt ingesteld. - De velden
monthenyearvormen een datumhiërarchie op het ordervelddate: elk daarvan wordt op naam gedefinieerd op het velddate, niet op de onderliggende kolomo_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: datesorteert het venster chronologisch. -
range: currentbeperkt het venster tot één dag zonder aggregatie over dagen. -
semiadditive: lastretourneert 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
-
Definieer eerst atomische metingen: Stel fundamentele metingen (
SUM,COUNT,AVG) vast voordat u metingen definieert die ernaar verwijzen. -
Gebruiken
MEASURE()voor verwijzingen: Gebruik deMEASURE()functie bij het verwijzen naar een andere meting in eenexpr. Herhaal aggregatielogica niet handmatig. VermijdSUM(a) / COUNT(b)bijvoorbeeld of er al metingen voor beide waarden bestaan. -
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. - 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.