Historiser les changements de données (Slowly Changing Dimensions) est un sujet classique en entretien. dbt snapshots offrent une solution élégante mais qui nécessite une vraie compréhension.
Quelle est la différence entre SCD1, SCD2 et SCD3 ? Quand utilisez-vous SCD2 ?
| Type | Historique | Complexité | Cas d'usage |
|---|---|---|---|
| SCD1 | Aucun | Simple | Données de référence, corrections |
| SCD2 | Complet | Élevée | Dimensions clients, produits, géographie |
| SCD3 | Partiel (N versions) | Moyenne | Rare |
Qu'est-ce qu'un snapshot dbt ? Comment le configurez-vous ?
-- snapshots/customers_snapshot.sql
{% snapshot customers_snapshot %}
{{
config(
target_schema='snapshots',
unique_key='customer_id',
strategy='timestamp',
updated_at='updated_at',
invalidate_hard_deletes=True
)
}}
SELECT
customer_id,
email,
plan,
segment,
country,
updated_at
FROM {{ source('crm', 'customers') }}
{% endsnapshot %}
-- Colonnes ajoutées automatiquement par dbt :
-- dbt_scd_id : clé primaire du snapshot (hash)
-- dbt_valid_from : date de début de validité
-- dbt_valid_to : date de fin (NULL = enregistrement actuel)
-- dbt_updated_at : timestamp de la dernière mise à jourunique_key=['id', 'source']Quelle est la différence entre la stratégie timestamp et check dans les snapshots dbt ?
-- Stratégie TIMESTAMP : recommandée
-- Utilise une colonne updated_at pour détecter les changements
-- Rapide : compare juste un timestamp
{{
config(
strategy='timestamp',
updated_at='updated_at' -- colonne de la source
)
}}
-- Stratégie CHECK : quand pas d'updated_at
-- Compare la valeur de colonnes spécifiées
-- Plus lente : hash des colonnes à chaque run
{{
config(
strategy='check',
check_cols=['plan', 'segment', 'country']
-- ou check_cols='all' pour toutes les colonnes
)
}}updated_at fiable dans la source. Rapide et scalableQue se passe-t-il quand une ligne est supprimée dans la source ? Comment le gérer ?
-- Avec invalidate_hard_deletes=True
-- dbt marque les enregistrements supprimés avec dbt_valid_to = current_timestamp
-- La colonne dbt_is_deleted est ajoutée automatiquement
-- Requête pour analyser les suppressions
SELECT
customer_id,
email,
dbt_valid_from,
dbt_valid_to,
CASE WHEN dbt_valid_to IS NULL THEN 'actif' ELSE 'inactif/supprimé' END AS statut
FROM {{ ref('customers_snapshot') }}
WHERE customer_id = 12345
ORDER BY dbt_valid_from;WHERE is_deleted = falseComment interrogez-vous un snapshot pour obtenir l'état actuel vs l'état historique ?
-- État ACTUEL : enregistrements dont dbt_valid_to est NULL
-- models/marts/dim_customers.sql
SELECT
customer_id,
email,
plan,
segment,
dbt_valid_from AS snapshot_date
FROM {{ ref('customers_snapshot') }}
WHERE dbt_valid_to IS NULL -- enregistrements actifs uniquement
-- État HISTORIQUE : quel segment avait ce client au moment de sa commande ?
-- Utile pour l'attribution correcte
SELECT
o.order_id,
o.customer_id,
o.amount,
o.order_date,
c.segment AS segment_at_order_time -- segment du client AU MOMENT de la commande
FROM {{ ref('fct_orders') }} o
JOIN {{ ref('customers_snapshot') }} c
ON o.customer_id = c.customer_id
AND o.order_date BETWEEN c.dbt_valid_from AND COALESCE(c.dbt_valid_to, CURRENT_DATE)-- Consommer un snapshot dbt correctement
-- Etat ACTUEL : enregistrements dont dbt_valid_to est NULL
SELECT customer_id, email, plan, segment, dbt_valid_from AS depuis
FROM {{ ref('customers_snapshot') }}
WHERE dbt_valid_to IS NULL;
-- Etat HISTORIQUE : quel segment avait ce client au moment de sa commande ?
-- Indispensable pour l attribution correcte
SELECT
o.order_id, o.amount, o.order_date,
c.segment AS segment_au_moment_de_la_commande
FROM {{ ref('fct_orders') }} o
JOIN {{ ref('customers_snapshot') }} c
ON o.customer_id = c.customer_id
AND o.order_date BETWEEN c.dbt_valid_from AND COALESCE(c.dbt_valid_to, CURRENT_DATE);
-- Analyser l evolution d un client
SELECT customer_id, plan, segment, dbt_valid_from, dbt_valid_to
FROM {{ ref('customers_snapshot') }}
WHERE customer_id = 'CUST-42'
ORDER BY dbt_valid_from;| Niveau | Maîtrise | Signal GO | NO-GO |
|---|---|---|---|
| Confirmé | SCD1 vs SCD2, configuration snapshot dbt, stratégie timestamp | Explique les 3 types de SCD, a configuré un snapshot avec stratégie timestamp, sait requêter l'état actuel | Ne sait pas ce qu'est un SCD2, n'a jamais utilisé les snapshots dbt |
| Senior | Gestion des suppressions, jointures historiques, check vs timestamp, performance | Gère les hard deletes, fait des jointures temporelles pour l'attribution historique, connaît les limites de performance | Ne sait pas comment joindre une table de faits avec un SCD2 au bon moment |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.