đŻ ProblĂšme mĂ©tier
Dans une table de faits (par exemple : commandes, paiements…), il arrive que certaines donnĂ©es arrivent en retard, plusieurs jours aprĂšs lâĂ©vĂ©nement rĂ©el.
Exemples :
- une commande du 5 juin arrive en base source le 10 juin
- une mise Ă jour dâun enregistrement existant est retardĂ©e Ă cause dâun bug ou dâun ETL lent
Si tu utilises un modĂšle incremental classique avec un filtre sur la date du jour (event_date = current_date
), tu risques de manquer ces données en retard.
â
Solution : Lookback window + merge
strategy
Rejouer uniquement les
n
derniers jours (ex : 7 jours) et utiliser une stratégiemerge
pour insérer ou mettre à jour les lignes.
đ§± Exemple complet dbt
đ ModĂšle : fact_commandes.sql
{{ config(
materialized = 'incremental',
incremental_strategy = 'merge',
unique_key = 'id_commande'
) }}
SELECT *
FROM {{ ref('stg_commandes') }}
WHERE date_commande >= dateadd(day, -7, current_date)
đ Explications :
ĂlĂ©ment | RĂŽle |
---|---|
materialized = 'incremental' | active l’incrĂ©mental |
incremental_strategy = 'merge' | dbt générera un MERGE si supporté par le warehouse |
unique_key = 'id_commande' | identifie de maniÚre unique chaque ligne à insérer ou mettre à jour |
WHERE date_commande >= ... | dĂ©finit la fenĂȘtre de rattrapage (“lookback window”) |
đ Que fait dbt ?
Si tu fais :
dbt run --select fact_commandes
dbt générera un SQL comme :
MERGE INTO analytics.fact_commandes AS target
USING (SELECT * FROM stg_commandes WHERE date_commande >= ...) AS source
ON target.id_commande = source.id_commande
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT ...
â
Les données en retard sont corrigées automatiquement
â Pas besoin de full-refresh
â ïž NĂ©cessite un entrepĂŽt qui supporte MERGE
(BigQuery, Snowflake, Redshift…)
đ Pourquoi câest efficace ?
Avantage | Description |
---|---|
â DonnĂ©es en retard prises en compte | tu ne perds rien si une ligne arrive 3 jours plus tard |
âïž RequĂȘtes lĂ©gĂšres | tu ne rejoues que 7 jours, pas toute lâhistoire |
đ§Œ Pas de doublons | grĂące Ă unique_key |
đ Update automatique | dbt met Ă jour les lignes existantes si besoin |
đ§ Compatible avec le concept de “donnĂ©es chaudes” | tu rejoues une “fenĂȘtre glissante” de donnĂ©es rĂ©centes |
đ§ Bonus : affiner la logique avec is_incremental()
SELECT *
FROM {{ ref('stg_commandes') }}
{% if is_incremental() %}
WHERE date_commande >= dateadd(day, -7, current_date)
{% endif %}
â Cela permet de :
- rejouer tout à la premiÚre exécution (pas de filtre)
- appliquer la lookback uniquement en mode incrémental
â RĂ©sumĂ© final
ĂlĂ©ment clĂ© | RĂŽle |
---|---|
incremental_strategy = 'merge' | GĂšre insertions et mises Ă jour |
unique_key | évite les doublons |
Lookback window (WHERE date >= ) | gÚre les données en retard |
is_incremental() | logique conditionnelle Ă lâincrĂ©mental |
Recommandé pour | tables de faits avec arrivées tardives (commandes, paiements, etc.) |