Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les techniques avancées pour les vues de métriques vous permettent d’exprimer une logique métier complexe et de réutiliser des définitions dans votre couche sémantique. Cette page explique deux techniques de ce type :
- Mesures de fenêtre : pour les calculs sur des séries temporelles, tels que les moyennes mobiles, les cumuls et les variations d’une période à l’autre.
- Composabilité : pour créer des mesures complexes en référençant d’autres mesures plutôt que de réécrire leur logique.
Cette page suppose une connaissance des concepts de modélisation des vues métriques de base. Consultez les vues des métriques de modèle.
Note
Les exemples de cette page utilisent l’exemple de jeu de données TPC-H, qui modélise une chaîne d’approvisionnement en gros. Pour plus d’informations sur le jeu de données TPC-H, consultez tpch. Pour obtenir un didacticiel de bout en bout à l’aide de ce jeu de données avec des vues de métriques, consultez Tutoriel : créer une vue de métrique avec des jointures et la modélisation des données.
Mesures de fenêtre
Les mesures de fenêtre vous permettent de définir des mesures avec des agrégations fenêtrées, cumulatives ou semi-additives dans vos vues de mesures. Ils prennent en charge les calculs tels que les moyennes mobiles, les changements de période sur période et les totaux en cours d’exécution.
Vous pouvez ajouter une mesure de fenêtre dans l’éditeur de l’Explorateur de catalogues ou dans YAML.
Ajouter une mesure de fenêtre dans l’éditeur
Sous l’onglet Interface utilisateur de l’éditeur d’affichage des métriques, cliquez sur + Fenêtre lors de la modification d’une mesure. + Fenêtre est disponible en mode Générateur et Personnalisé . Les options de fenêtre dans l’éditeur correspondent aux champs YAML décrits dans Définir une mesure de fenêtre.
Pour plus d’informations sur la création et la modification de mesures, consultez Créer une vue de métrique.
Définir une mesure de fenêtre
Une mesure de fenêtre inclut les champs obligatoires suivants :
order : champ qui détermine l’ordre de la fenêtre.
plage : définit l’étendue de la fenêtre. Les valeurs
current,cumulative,trailing,leadingetallsont prises en charge. Pour obtenir une syntaxe et des descriptions complètes, consultez Les valeurs prises en chargerange. Pour plus d’informations sur les modificateursinclusiveetexclusivesurtrailingetleading, consultez Inclure ou exclure la ligne d’ancrage.semi-additive : spécifie comment agréger la mesure lorsque le champ de commande n’est
GROUP BYpas inclus dans la requête. Valeurs possibles :firstetlast.
Une mesure de fenêtrage prend également en charge le champ facultatif suivant :
-
offset : déplace le cadre de la fenêtre vers l’arrière ou l’avant le long du
orderchamp par un intervalle fixe. Utilisez cette option pour les mesures de période sur plusieurs périodes, telles que le mois sur mois ou l’année sur l’année. Pour connaître la syntaxe, les unités prises en charge et les contraintes, consultez Mesures de fenêtre.
Vous pouvez aussi référencer un paramètre entier comme la valeur d’une mesure range de fenêtre ou offset, afin qu’un appelant transmette la taille de la fenêtre au moment de la requête.
Voir « Passer une taille de fenêtre » comme paramètre.
Comment offset décaler le cadre de la fenêtre
Consultez la disponibilité des fonctionnalités d’affichage des métriques pour connaître les exigences minimales en matière de version de spécification YAML et de calcul.
Le champ range définit la forme de la fenêtre par rapport à la ligne d’ancrage, et offset fait glisser ce cadre de l’intervalle spécifié le long de order. La table suivante montre la plage de chaque valeur range avec et sans un offset de k, par rapport à la ligne d’ancrage t :
| range | Cadre sans offset | Encadrer avec 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 |
partition complète | partition entière (inchangée) |
offset est indépendant de semiadditive. Le choix first ou last contrôle toujours la façon dont la mesure est réduite lorsque order ne figure pas dans le GROUP BY de la requête.
Pour de meilleurs résultats, faites correspondre offset au grain naturel de order. Pour les données mensuelles, offset: -12 month est préférable à offset: -365 day car les calculs sur les mois et les années tiennent compte de la durée variable des mois et des années bissextiles, alors que ce n’est pas le cas des calculs avec day.
Inclure ou exclure la ligne d’ancrage
Consultez la disponibilité des fonctionnalités d’affichage des métriques pour connaître les exigences minimales en matière de version de spécification YAML et de calcul.
Pour les plages trailing et leading, le mot-clé facultatif inclusive ou exclusive détermine si la valeur de fenêtre de la ligne d’ancrage (par exemple, aujourd’hui) fait partie de la fenêtre glissante :
| Mot clé | Meaning | Ancrer la ligne dans la plage ? |
|---|---|---|
inclusive |
n unités incluant la ligne d’ancrage. | Oui |
exclusive (valeur par défaut) |
n unités non comprises dans la ligne d’ancrage. | Non |
L’exemple suivant montre comment inclusive et exclusive affectent la fenêtre glissante pour la date d’ancrage 2025-01-05 avec trailing 3 day.
Supposons que les données sous-jacentes ont une ligne par jour avec les valeurs suivantes :
| Date | Valeur |
|---|---|
2025-01-02 |
1 |
2025-01-03 |
4 |
2025-01-04 |
2 |
2025-01-05 (ancre) |
5 |
Chaque modificateur sélectionne les lignes correspondant à trois jours par rapport à l’ancre et en additionne les valeurs :
| Modificateur | Dates dans la fenêtre | Values | Somme |
|---|---|---|---|
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 Les plages suivent la même logique en sens inverse.
Exemple de mesure de fenêtre de début, de fin ou de fenêtre dynamique
L’exemple suivant calcule un nombre continu de 7 jours de clients qui ont passé des commandes. Cette métrique suit les tendances de l’engagement client au fil du temps en montrant combien de clients distincts ont effectué des achats pendant la semaine précédant chaque date.
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
Pour cet exemple, la configuration suivante s’applique :
-
order: datespécifie que le champdateordonne la fenêtre. -
range: trailing 7 daydéfinit la fenêtre comme étant les 7 jours avant chaque date, à l’exclusion de la date elle-même. -
semiadditive: lastretourne la dernière valeur dans la fenêtre de 7 jours quanddaten’est pas une colonne de regroupement.
Créer la vue métrique à l’aide de SQL
Pour créer cette vue de métrique en dehors de l’Explorateur de catalogues, encapsulez le YAML dans CREATE OR REPLACE VIEW ... WITH METRICS LANGUAGE YAML AS et placez la définition entre les délimiteurs $$ :
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
$$
Les autres définitions complètes de cette page suivent le même modèle.
Exemple de mesure de fenêtre d’une période à l’autre
L’exemple suivant calcule la croissance des ventes quotidiennes en comparant le chiffre d’affaires d’aujourd’hui (somme de tous les prix de commande) au chiffre d’affaires d’hier. Cette métrique identifie les tendances quotidiennes des ventes et montre le pourcentage de variation du chiffre d’affaires.
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
Pour cet exemple, la configuration suivante s’applique :
- L'exemple utilise deux mesures de fenêtre : une pour calculer le total des ventes le jour précédent et l’autre pour le jour actuel.
- Une troisième mesure calcule la variation du pourcentage (croissance) entre les jours actuels et les jours précédents.
Exemple de mesure de fenêtre d’une année sur l’autre à l’aide de offset
Le offset modificateur est le bloc de construction pour les mesures d’une période à l’autre. Définissez une copie décalée d’une mesure de base, puis composez les deux pour exprimer des deltas, des ratios ou des taux de croissance directement dans la vue des métriques.
L’exemple suivant calcule la croissance des ventes annuelles en comparant les ventes de chaque mois au même mois de l’année précédente. La mesure différée utilise offset: -12 month pour remonter 12 mois en arrière dans le champ month.
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)
Pour cet exemple, la configuration suivante s’applique :
-
monthly_salesest la mesure de base, additionnant les ventes pour le mois en cours. -
monthly_sales_pyest la même mesure décalée de 12 mois en arrière à l’aide deoffset: -12 month. Pour janvier 2025, elle retourne la valeur de janvier 2024. -
yoy_growthetyoy_growth_pctcomposez les deux mesures pour exprimer le changement absolu et de pourcentage. L’utilisationNULLIFévite les erreurs de division par zéro lorsque la valeur de l’année précédente est égale à zéro.
Exemple de mesure de total cumulatif progressif
L’exemple suivant calcule le chiffre d’affaires cumulé du début du jeu de données jusqu’à chaque date. Ce total en cours d’exécution montre combien le chiffre d’affaires total a été généré au fil du temps, utile pour suivre les progrès vers les objectifs annuels de chiffre d’affaires ou analyser les modèles de croissance à long terme.
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
Pour cet exemple, la configuration suivante s’applique :
-
order: datetrie la fenêtre par ordre chronologique. -
range: cumulativedéfinit la fenêtre comme l’ensemble des données depuis le début du jeu de données jusqu’à chaque date incluse. -
semiadditive: lastretourne la valeur cumulative la plus récente lorsqu’elledaten’est pas incluse dans les données deGROUP BYla requête, au lieu de la somme de toutes les dates.
Exemple de mesure de cumul périodique jusqu’à ce jour
L’exemple suivant calcule le chiffre d’affaires depuis le début de l'année (YTD). Cette mesure montre le chiffre d’affaires cumulé généré du 1er janvier de chaque année jusqu’à ce jour, réinitialisée au début de chaque nouvelle année.
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
Pour cet exemple, la configuration suivante s’applique :
- L’exemple utilise deux spécifications de fenêtre : une pour la somme cumulative sur le
datechamp et une autre pour limiter la somme à l’annéecurrent. - Le
yearchamp limite la somme cumulative afin qu’elle soit réinitialisée au début de chaque nouvelle année. - Les champs
monthetyearforment une hiérarchie de dates sur le champ de commandedate: chacun est défini sur le champdatepar son nom, et non sur la colonneo_orderdatesous-jacente, afin que les requêtes puissent regrouper cette mesure en fonction d’eux. Voir Regrouper par champ de hiérarchie de dates.
Exemple de mesure semi-additive
L’exemple suivant calcule les soldes de compte, qui ne doivent pas être additionnés entre les dates (vous ne pouvez pas ajouter le solde du lundi au solde du mardi pour obtenir le solde total). Au lieu de cela, lors de l’agrégation sur plusieurs jours, la mesure retourne le solde le plus récent. Toutefois, la mesure peut toujours être additionnée entre les clients pour afficher le solde total sur tous les comptes un jour donné.
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
Pour cet exemple, la configuration suivante s’applique :
-
order: datetrie la fenêtre par ordre chronologique. -
range: currentlimite la fenêtre à un seul jour sans agrégation sur plusieurs jours. -
semiadditive: lastretourne le solde le plus récent lors de l’agrégation sur plusieurs jours.
Note
Cette mesure de fenêtre continue de totaliser les soldes de tous les clients afin d’obtenir le solde global par jour.
Interroger une mesure de fenêtre
Vous pouvez interroger une vue métrique avec une mesure de fenêtre comme n’importe quelle autre vue métrique. Une mesure de fenêtre est calculée le long de son order champ. Par conséquent, une requête qui décompose les résultats au fil du temps doit référencer ce champ, directement ou via un champ de hiérarchie de dates défini sur celui-ci. Lorsque la requête ne référence pas le champ d’ordre, le semiadditive mot clé détermine la valeur retournée, comme décrit dans l’exemple de mesure Semiadditive.
L’exemple suivant regroupe une mesure de fenêtre selon state et selon une expression de mois sur le champ de commande 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
Regrouper par champ de hiérarchie de dates
Une hiérarchie de dates agrège le champ de tri à des niveaux de granularité plus élevés, tels que la semaine, le mois ou l’année. Définissez chaque niveau en tant que champ sur le champ de commande par nom, et non sur la colonne source sous-jacente :
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)
Le regroupement d’une mesure de fenêtre selon un niveau de hiérarchie renvoie la mesure à ce fragment. En supposant que l’exemple de période à ce jour soit créé sous la forme ytd_metric_view, comme dans l’exemple de mesure de période à ce jour, la requête suivante renvoie la valeur YTD à la dernière date de chaque mois :
SELECT month, MEASURE(ytd_sales) AS ytd_sales
FROM ytd_metric_view
GROUP BY month
ORDER BY month;
Avertissement
La définition d’un niveau de hiérarchie sur la colonne source sous-jacente, par exemple DATE_TRUNC('MONTH', o_orderdate), interrompt son lien vers le champ dated’ordre, même si les expressions sont équivalentes. Le regroupement d’une mesure de fenêtre par un tel champ retourne des résultats incorrects.
Composabilité
Les vues de métriques peuvent être composées. Vous pouvez créer de nouveaux champs et mesures qui référencent des champs existants plutôt que de réécrire la logique à partir de zéro. Cela réduit la duplication et facilite la maintenance des définitions de métriques complexes.
La composabilité fonctionne à deux niveaux : au sein d’une vue de métrique unique et entre les vues de métriques quand une vue de métrique est utilisée comme source pour une autre.
La composabilité prend en charge les modèles de référence suivants :
- Champs antérieurs dans de nouveaux champs.
- Champs et mesures antérieures dans de nouvelles mesures.
- Les champs issus des vues de métriques utilisés comme source dans de nouveaux champs.
- Champs et mesures des vues de métriques servant de source à de nouvelles mesures.
Définir des mesures avec la composabilité
Dans la measures section, vous pouvez référencer des mesures à partir de la vue de métrique source ou des mesures définies précédemment dans la même vue de métrique. Cette approche améliore la cohérence, l’auditabilité et la maintenance de votre couche sémantique.
| Type de mesure | Description | Example |
|---|---|---|
| Atomique | Agrégation simple et directe d'une colonne source. Ils forment les blocs de construction. | SUM(o_totalprice) |
| Composé | Expression qui combine mathématiquement une ou plusieurs autres mesures à l’aide de la MEASURE() fonction. |
MEASURE(total_revenue) / MEASURE(order_count) |
Exemple : Valeur de commande moyenne (AOV)
L’exemple suivant définit la valeur moyenne de l’ordre (AOV) à l’aide de deux mesures atomiques : total_revenue (somme des prix de commande) et order_count (nombre de commandes). La avg_order_value mesure fait référence aux deux mesures atomiques.
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)
Si la total_revenue définition change (par exemple, pour exclure la taxe), avg_order_value utilise automatiquement la définition mise à jour.
Composabilité avec une logique conditionnelle
Vous pouvez utiliser la composabilité pour créer des ratios complexes, des pourcentages conditionnels et des taux de croissance sans compter sur les fonctions de fenêtre pour des calculs simples sur période.
Exemple : Taux de traitement
L’exemple suivant calcule le taux de traitement : pourcentage de commandes avec état 'F' (rempli). La mesure divise les commandes remplies par le total des commandes.
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
Meilleures pratiques pour la composabilité
-
Définissez d’abord les mesures atomiques : établissez des mesures fondamentales (
SUM,COUNT,AVG) avant de définir des mesures qui les référencent. -
Utiliser
MEASURE()pour les références : utilisez laMEASURE()fonction lors du référencement d’une autre mesure dans unexpr. Ne répétez pas manuellement la logique d’agrégation. Par exemple, évitezSUM(a) / COUNT(b)si des mesures pour les deux valeurs existent déjà. -
Hiérarchiser la lisibilité : composez des mesures à l’aide de formules mathématiques claires. Par exemple,
MEASURE(gross_profit) / MEASURE(total_revenue)il est plus clair qu’une seule expression SQL complexe. - Ajouter des métadonnées sémantiques : utilisez des métadonnées sémantiques pour mettre en forme des mesures composées (par exemple, des pourcentages ou des devises) pour les outils en aval. Consultez les métadonnées de l’agent dans les vues de métriques.