Aller au contenu principal

Utiliser des expressions de niveau de détail (LOD) dans les vues métriques

Les expressions de niveau de détail (LOD) vous permettent de spécifier la granularité à laquelle calculer les agrégations, indépendamment des champs (également appelés dimensions) dans votre query. Ceci vous permet de compute des métriques comme le pourcentage du total, où le dénominateur agrège à une granulométrie plus grossière que la query.

Que sont les expressions de niveau de détail ?

Les expressions de niveau de détail vous permettent de spécifier exactement les champs à utiliser lors du calcul d'un agrégat, quels que soient les champs présents dans votre query. Cela vous donne un contrôle précis sur la portée de vos calculs.

Il existe deux types d'expressions de niveau de détail :

  • Niveau de détail fixe : Agréger sur un ensemble de champs prédéfini spécifié dans l'expression elle-même, en ignorant les autres champs de la query.
  • Niveau de détail plus grossier : Agrégez à une granularité plus grossière que la query en excluant des champs spécifiques du regroupement.

Niveau de détail fixe

Une expression de niveau de détail fixe compute un agrégat à une granularité que vous définissez, en ignorant les champs de votre query. Dans les vues de métriques, les expressions LOD fixes sont définies directement dans le champ expr d'une définition de colonne en utilisant des fonctions de fenêtre SQL avec des clauses PARTITION BY.

Quand utiliser un niveau de détail fixe

Utilisez des expressions de niveau de détail fixe lorsque vous avez besoin des éléments suivants :

  • Aucune dépendance vis-à-vis des regroupements de query : Métriques avec partitionnement statique pour toutes les utilisations.
  • Agrégats au niveau du dataset : Agrégats globaux comparés aux regroupements au niveau des lignes (par exemple, pourcentage des ventes totales par priorité).
  • Hiérarchies multiniveaux : Métriques de niveau détaillé et de niveau agrégé disponibles dans la même vue de métrique.

Syntaxe

Les expressions LOD fixes utilisent les fonctions de fenêtre SQL pour calculer des agrégats à une granularité définie. Placez la fonction de fenêtre directement dans le champ expr d’une définition de champ :

YAML
fields:
- name: <lod_name>
expr: <AGGREGATE_FUNCTION>(<column>) OVER (PARTITION BY <dim1>, <dim2>, ...)

Pour agréger l'ensemble du dataset, omettez la clause PARTITION BY et laissez des parenthèses vides après OVER.

Exemple : ventes totales par priorité de commande

Supposons que vous souhaitiez définir une vue métrique où les ventes de chaque commande peuvent être comparées au total des ventes de son groupe prioritaire. L'exemple suivant calcule priority_total_price dans la requête source et l'expose comme un champ d'identité :

YAML
version: 1.1

source: samples.tpch.orders

fields:
- name: order_priority
expr: o_orderpriority
- name: order_date
expr: o_orderdate
- name: priority_total_price
expr: SUM(o_totalprice) OVER (PARTITION BY o_orderpriority)

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

- name: pct_of_priority_total
expr: SUM(o_totalprice) / ANY_VALUE(priority_total_price)

Le champ priority_total_price définit le total fixe pour chaque groupe de priorité directement dans son champ expr. La mesure pct_of_priority_total divise les Ventes de commandes individuelles par ce total fixe pour produire un pourcentage, quelle que soit la façon dont la query groupe les résultats.

remarque

Lorsque vous référencez un champ de niveau de détail fixe dans une expression de mesure, enveloppez-le dans une fonction d'agrégation. Utilisez ANY_VALUE lorsque la valeur est constante au sein d’un groupe, comme dans l’exemple précédent.

Créez la vue métrique à l'aide de SQL.

Pour créer cette vue métrique en dehors de l'Explorateur de catalogues, enveloppez le YAML dans CREATE OR REPLACE VIEW ... WITH METRICS LANGUAGE YAML AS et placez la définition entre les délimiteurs $$ :

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

source: samples.tpch.orders

fields:
- name: order_priority
expr: o_orderpriority
- name: order_date
expr: o_orderdate
- name: priority_total_price
expr: SUM(o_totalprice) OVER (PARTITION BY o_orderpriority)

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

- name: pct_of_priority_total
expr: SUM(o_totalprice) / ANY_VALUE(priority_total_price)
$$

L'exemple de niveau de détail plus grossier sur cette page suit le même modèle.

Filtrage sur les expressions de niveau de détail fixe

Les expressions à niveau de détail fixe sont computées avant l'application de tout filtre de temps de query. Pour appliquer un filtre à un calcul LOD fixe, incluez la condition de filtre dans l'expression de la fonction de fenêtre en utilisant une instruction CASE ou une clause FILTER.

Niveau de détail plus grossier

Une expression de niveau de détail plus grossier agrège à une granularité plus grossière que la requête en excluant un ou plusieurs champs de la partition. Dans les vues d'indicateurs, les expressions LOD plus grossières sont implémentées à l'aide de mesures de fenêtre avec la spécification de plage all.

info

Expérimental

Les mesures de fenêtre sont expérimentales.

Quand utiliser un niveau de détail plus grossier

Utilisez des expressions avec un niveau de détail plus grossier lorsque vous avez besoin :

  • Regroupements dynamiques : agrégats qui s'adaptent aux regroupements de query (par exemple, pourcentage du total pour tout champ sélectionné).
  • Agrégations sensibles aux filtres : Compute à une granularité plus grossière tout en respectant les filtres de query.

Syntaxe

Pour chaque champ à exclure de la partition, définissez une mesure de fenêtre avec range: all:

YAML
measures:
- name: <measure_name>
expr: <AGGREGATE_EXPRESSION>
window:
- order: <field_to_exclude>
range: all
semiadditive: last

Pour exclure plusieurs champs, ajoutez une entrée au tableau window pour chaque champ.

Exemple : pourcentage des ventes totales

Pour calculer le pourcentage du total des ventes pour chaque priorité de commande :

YAML
version: 1.1

source: samples.tpch.orders

fields:
- name: order_priority
expr: o_orderpriority

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

- name: all_priorities_sales
expr: SUM(o_totalprice)
window:
- order: order_priority
range: all
semiadditive: last

- name: pct_of_total_sales
expr: SUM(o_totalprice) / MEASURE(all_priorities_sales)

Dans cet exemple :

  • total_sales agrégats au niveau de regroupement de la query.
  • all_priorities_sales utilise range: all pour calculer un total général pour toutes les priorités de commande, en ignorant le champ order_priority dans la query.
  • pct_of_total_sales divise les Ventes de niveau de priorité par le total général pour produire un pourcentage.

Ressources supplémentaires