dbt: moyennes glissantes (rolling averages) dans la couche metrics de dbt

Cet article parle de la mise en place de moyennes glissantes (rolling averages) directement dans la couche metrics de dbt, en utilisant une configuration propre via la propriété window.


🧠 Contexte : dbt Metrics Layer

Depuis dbt v1.3+, tu peux déclarer des metrics (indicateurs métier) dans un fichier .yml, indépendamment des modèles SQL, par exemple :

metrics:
  - name: average_panier
    model: ref('fct_commandes')
    label: "Montant moyen par commande"
    calculation_method: average
    expression: montant
    timestamp: date_commande
    time_grains: [day, week, month]

👉 C’est déclaratif, compatible avec dbt Semantic Layer ou dbt Cloud Explore.


📌 Objectif : moyenne glissante (rolling average)

Tu veux dire :

“Je veux une moyenne sur les 30 derniers jours (ou 6 dernières semaines, etc.)”


✅ dbt te permet ça via la propriété window

🔧 Exemple :

metrics:
  - name: moyenne_30j
    model: ref('fct_commandes')
    calculation_method: average
    expression: montant
    timestamp: date_commande
    time_grains: [day]
    window:
      count: 30
      period: day

🔁 Cela signifie : “faire une moyenne glissante sur les 30 derniers jours“.


🔍 Que fait dbt avec cette config ?

dbt va générer une requête SQL avec une fonction analytique AVG(...) OVER (...) avec une fenêtre de type :

AVG(montant) OVER (
  ORDER BY date_commande
  ROWS BETWEEN 29 PRECEDING AND CURRENT ROW
)

Ou bien la syntaxe équivalente dépendant du data warehouse (Snowflake, BigQuery, Redshift…).


✅ Avantages

AvantageDétail
🔁 Recalcul dynamiquedbt adapte la requête à chaque time grain
📅 Respect du calendrierdbt gère les périodes vides ou nulles automatiquement
⚙️ Optimisédbt peut ajuster la requête selon le dialecte SQL
🧩 RéutilisableTu peux appeler la metric partout (exposures, dashboards, etc.)

⚠️ Conditions pour que ça marche

ConditionDétail
timestamp doit être définiex. : date_commande
time_grains doit inclure day, week, etc.
Ton entrepôt doit supporter les fonctions fenêtres (c’est le cas de tous les warehouses modernes)

🧠 Résumé

ÉlémentRôle
window:Permet de définir une fenêtre glissante (rolling)
count:Taille de la fenêtre
period:Unité (jour, semaine, mois)
calculation_method: average + expression:Indique la moyenne à calculer
AvantageCohérence entre modèles, SQL généré propre, facile à réutiliser

Excellente question Walid 👌
Une fois que tu as défini une metric dans un fichier .yml, tu peux l’exploiter de plusieurs façons selon ton environnement :


✅ Où peut-on trouver et utiliser les metrics définies dans dbt ?

1. 🔍 Dans la documentation générée (dbt docs serve)

Quand tu fais :

dbt docs generate
dbt docs serve

➡️ Tu verras un onglet Metrics à côté des modèles, sources, etc.
Tu pourras y consulter :

  • le nom de la métrique
  • sa méthode de calcul (average, sum, etc.)
  • son modèle source
  • ses time grains
  • sa description

2. 📦 Via la Semantic Layer (dbt Cloud ou dbt-core avec un client)

👉 Si tu es sur dbt Cloud :

Tu peux utiliser l’explorateur de données dans l’interface web (Explore), sélectionner une métrique et l’agréger dynamiquement avec un time grain (jour, mois, etc.).

👉 Si tu es sur dbt-core :

Tu peux appeler la métrique dans un modèle SQL en utilisant la macro :

SELECT *
FROM {{ metrics.calculate(
    metric('moyenne_30j'),
    grain='day',
    start_date='2024-01-01',
    end_date='2024-02-01'
) }}

⚠️ Il faut pour cela avoir activé le support de metrics via un plugin ou un wrapper comme dbt-metricflow.


3. 📊 Dans un outil BI compatible Semantic Layer (dbt Cloud + Looker, Mode, Hex…)

Si ton outil de dashboard est connecté à dbt Cloud, tu peux :

  • interroger directement une metric sans écrire de SQL
  • l’utiliser comme une brique métier (ex. : “Moyenne 30j des ventes par produit”)

Exemple : dans Looker, on peut appeler les metrics dbt comme s’il s’agissait de dimensions/mesures natives.


4. 📄 En SQL brut, via un modèle dbt intermédiaire

Tu peux aussi appeler manuellement une metric dans un modèle .sql avec :

-- models/marts/ventes/moyenne_30j.sql

SELECT *
FROM {{ metrics.calculate(
    metric('moyenne_30j'),
    grain='day',
    start_date='2024-01-01',
    end_date='2024-06-01'
) }}

Ce modèle pourra ensuite être utilisé comme une table logique ou un ref() classique.


🧠 Résumé

Où ?Comment accéder aux metrics
📚 dbt docs serveInterface de documentation
🧠 dbt Semantic LayerRequêtes dynamiques via metrics.calculate
📦 dbt CloudInterface “Explore” + intégration BI
🧾 Modèle SQLMacro metrics.calculate()
📊 Dashboard Looker / Hex / ModeIntégration directe avec dbt Cloud (via Semantic Layer)

Une fois que tu as défini une metric dans un fichier .yml, tu peux l’exploiter de plusieurs façons selon ton environnement :


✅ Où peut-on trouver et utiliser les metrics définies dans dbt ?

1. 🔍 Dans la documentation générée (dbt docs serve)

Quand tu fais :

dbt docs generate
dbt docs serve

➡️ Tu verras un onglet Metrics à côté des modèles, sources, etc.
Tu pourras y consulter :

  • le nom de la métrique
  • sa méthode de calcul (average, sum, etc.)
  • son modèle source
  • ses time grains
  • sa description

2. 📦 Via la Semantic Layer (dbt Cloud ou dbt-core avec un client)

👉 Si tu es sur dbt Cloud :

Tu peux utiliser l’explorateur de données dans l’interface web (Explore), sélectionner une métrique et l’agréger dynamiquement avec un time grain (jour, mois, etc.).

👉 Si tu es sur dbt-core :

Tu peux appeler la métrique dans un modèle SQL en utilisant la macro :

SELECT *
FROM {{ metrics.calculate(
    metric('moyenne_30j'),
    grain='day',
    start_date='2024-01-01',
    end_date='2024-02-01'
) }}

⚠️ Il faut pour cela avoir activé le support de metrics via un plugin ou un wrapper comme dbt-metricflow.


3. 📊 Dans un outil BI compatible Semantic Layer (dbt Cloud + Looker, Mode, Hex…)

Si ton outil de dashboard est connecté à dbt Cloud, tu peux :

  • interroger directement une metric sans écrire de SQL
  • l’utiliser comme une brique métier (ex. : “Moyenne 30j des ventes par produit”)

Exemple : dans Looker, on peut appeler les metrics dbt comme s’il s’agissait de dimensions/mesures natives.


4. 📄 En SQL brut, via un modèle dbt intermédiaire

Tu peux aussi appeler manuellement une metric dans un modèle .sql avec :

-- models/marts/ventes/moyenne_30j.sql

SELECT *
FROM {{ metrics.calculate(
    metric('moyenne_30j'),
    grain='day',
    start_date='2024-01-01',
    end_date='2024-06-01'
) }}

Ce modèle pourra ensuite être utilisé comme une table logique ou un ref() classique.


🧠 Résumé

Où ?Comment accéder aux metrics
📚 dbt docs serveInterface de documentation
🧠 dbt Semantic LayerRequêtes dynamiques via metrics.calculate
📦 dbt CloudInterface “Explore” + intégration BI
🧾 Modèle SQLMacro metrics.calculate()
📊 Dashboard Looker / Hex / ModeIntégration directe avec dbt Cloud (via Semantic Layer)

Leave a Reply

Your email address will not be published. Required fields are marked *