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
Avantage | Détail |
---|---|
🔁 Recalcul dynamique | dbt adapte la requête à chaque time grain |
📅 Respect du calendrier | dbt gère les périodes vides ou nulles automatiquement |
⚙️ Optimisé | dbt peut ajuster la requête selon le dialecte SQL |
🧩 Réutilisable | Tu peux appeler la metric partout (exposures , dashboards, etc.) |
⚠️ Conditions pour que ça marche
Condition | Détail |
---|---|
timestamp doit être défini | ex. : 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ément | Rô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 |
Avantage | Cohé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 serve | Interface de documentation |
🧠 dbt Semantic Layer | Requêtes dynamiques via metrics.calculate |
📦 dbt Cloud | Interface “Explore” + intégration BI |
🧾 Modèle SQL | Macro metrics.calculate() |
📊 Dashboard Looker / Hex / Mode | Inté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 serve | Interface de documentation |
🧠 dbt Semantic Layer | Requêtes dynamiques via metrics.calculate |
📦 dbt Cloud | Interface “Explore” + intégration BI |
🧾 Modèle SQL | Macro metrics.calculate() |
📊 Dashboard Looker / Hex / Mode | Intégration directe avec dbt Cloud (via Semantic Layer) |