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 :
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é :
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.
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 $$ :
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.
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:
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 :
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_salesagrégats au niveau de regroupement de la query.all_priorities_salesutiliserange: allpour calculer un total général pour toutes les priorités de commande, en ignorant le champorder_prioritydans la query.pct_of_total_salesdivise les Ventes de niveau de priorité par le total général pour produire un pourcentage.
Ressources supplémentaires
- Mesures de fenêtre: le mécanisme sous-jacent pour les expressions de niveau de détail plus grossier dans les vues de métriques.
- Vues de métriques de Unity Catalog: présentation des composants de la vue de métriques et des modèles de modélisation.
- Expressions de niveau de détail (LOD): expressions LOD dans les tableaux de bord AI/BI.