AccueilBlogTest technique dbt snapshots et SCD : historiser les changements
Guide recrutement data

Test technique dbt snapshots et SCD : historiser les changements

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.

Data Builder·Juin 2025·6 min de lecture·Analytics Engineer · Data Engineer
Sommaire
  1. Types de SCD
  2. Snapshots dbt
  3. Stratégie timestamp
  4. Stratégie check
  5. Gestion des suppressions
  6. Consommer les snapshots
  7. Grille

1Types de SCD : lequel choisir

Question discriminante

Quelle est la différence entre SCD Type 1, 2 et 3 ? Donnez un exemple pour chaque.

TypeComportementExempleHistorique
SCD 1Écraser l ancienne valeurCorriger l email d un clientNon
SCD 2Créer une nouvelle ligne avec dates de validitéClient qui change de segmentComplet
SCD 3Ajouter une colonne previous_valueStatut actuel + précédentPartiel (1 version)
SCD 4Table d historique séparéeAudit trail completComplet mais séparé

2Snapshots dbt : SCD2 automatique

Question discriminante

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)

3Stratégie timestamp vs check

Question discriminante

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 valeurs

4Gérer les suppressions dans les snapshots

Question discriminante

Que se passe-t-il quand une ligne source est supprimée ? Comment invalidate_hard_deletes fonctionne ?

5Consommer les snapshots dans les modèles dbt

Question discriminante

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)

6Grille par niveau

NiveauMaitriseSignal GONO-GO
ConfirméSCD Type 1 et 2, snapshot dbt avec timestampA configuré un snapshot dbt, explique la différence SCD1 vs SCD2Ne sait pas ce qu est un SCD
SeniorStratégie check, invalidate_hard_deletes, consommation avancéeA géré des suppressions avec invalidate_hard_deletes, fait des requêtes historiquesNe sait pas ce que dbt_valid_to IS NULL signifie

Vous recrutez un Analytics Engineer ?

Premier entretien gratuit. Rapport GO/NO-GO sous 48h.