dbt: Lookback window + merge strategy

🎯 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égie merge 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Ă©mentRĂŽ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 ?

AvantageDescription
✅ DonnĂ©es en retard prises en comptetu ne perds rien si une ligne arrive 3 jours plus tard
⚙ RequĂȘtes lĂ©gĂšrestu ne rejoues que 7 jours, pas toute l’histoire
đŸ§Œ Pas de doublonsgrĂące Ă  unique_key
🔁 Update automatiquedbt 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é pourtables de faits avec arrivées tardives (commandes, paiements, etc.)

Leave a Reply

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