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 SCD Type 1, 2 et 3 ? Donnez un exemple pour chaque.
| Type | Comportement | Exemple | Historique |
|---|---|---|---|
| SCD 1 | Écraser l ancienne valeur | Corriger l email d un client | Non |
| SCD 2 | Créer une nouvelle ligne avec dates de validité | Client qui change de segment | Complet |
| SCD 3 | Ajouter une colonne previous_value | Statut actuel + précédent | Partiel (1 version) |
| SCD 4 | Table d historique séparée | Audit trail complet | Complet mais séparé |
Comment configurez-vous un snapshot dbt pour historiser les changements d une table clients ?
{# snapshots/snap_clients.sql #}
{% snapshot snap_clients %}
{{ config(
target_schema='snapshots',
unique_key='client_id',
strategy='timestamp',
updated_at='updated_at',
invalidate_hard_deletes=True
) }}
SELECT
client_id,
nom,
email,
segment, -- la colonne qui change
statut,
updated_at
FROM {{ source('crm', 'clients') }}
{% endsnapshot %}
-- Colonnes ajoutées automatiquement par dbt :
-- dbt_scd_id : identifiant unique de chaque version
-- dbt_updated_at : quand cette version a été créée
-- dbt_valid_from : début de validité
-- dbt_valid_to : fin de validité (NULL = version courante)Quelle est la différence entre strategy='timestamp' et strategy='check' ?
{# Stratégie timestamp : se base sur updated_at #}
{{ config(
strategy='timestamp',
updated_at='updated_at' -- colonne qui indique une modification
) }}
-- Simple mais nécessite une colonne updated_at fiable
{# Stratégie check : compare les valeurs de colonnes #}
{{ config(
strategy='check',
check_cols=['segment', 'statut', 'email'] -- colonnes à surveiller
-- ou check_cols='all' pour toutes les colonnes
) }}
-- Plus robuste si updated_at n est pas fiable
-- Plus lent car compare toutes les valeursQue se passe-t-il quand une ligne source est supprimée ? Comment invalidate_hard_deletes fonctionne ?
Comment créez-vous une vue de l état actuel et une vue de l historique complet ?
-- Vue de l état ACTUEL (SCD2 -> SCD1)
SELECT
client_id,
nom,
segment,
dbt_valid_from AS segment_changed_at
FROM {{ ref('snap_clients') }}
WHERE dbt_valid_to IS NULL -- version courante
-- Vue historique : état à une date donnée
SELECT
client_id,
nom,
segment
FROM {{ ref('snap_clients') }}
WHERE '2024-06-01' BETWEEN dbt_valid_from AND COALESCE(dbt_valid_to, '9999-12-31')
-- Analyse des changements de segment
SELECT
client_id,
LAG(segment) OVER (PARTITION BY client_id ORDER BY dbt_valid_from) AS ancien_segment,
segment AS nouveau_segment,
dbt_valid_from AS date_changement
FROM {{ ref('snap_clients') }}
WHERE segment != LAG(segment) OVER (PARTITION BY client_id ORDER BY dbt_valid_from)| Niveau | Maitrise | Signal GO | NO-GO |
|---|---|---|---|
| Confirmé | SCD Type 1 et 2, snapshot dbt avec timestamp | A configuré un snapshot dbt, explique la différence SCD1 vs SCD2 | Ne sait pas ce qu est un SCD |
| Senior | Stratégie check, invalidate_hard_deletes, consommation avancée | A géré des suppressions avec invalidate_hard_deletes, fait des requêtes historiques | Ne sait pas ce que dbt_valid_to IS NULL signifie |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.