Slowly Changing Dimensions beantworten die Frage: Was tun, wenn sich Dimensionsattribute ändern? Ein Kunde ändert seine Adresse, ein Produkt seine Kategorie — wie bewahrt man Historie und Berichtskonsistenz?
SCD-Typen¶
Type 1 — Überschreiben¶
Der alte Wert wird mit dem neuen überschrieben. Keine Historie — am einfachsten, aber Informationsverlust.
Type 2 — Neue Zeile¶
Bei einer Änderung wird eine neue Zeile hinzugefügt mit Gültigkeitsdaten (valid_from, valid_to). Vollständige Historie.
CREATE TABLE dim_customer_scd2 (
customer_key INT PRIMARY KEY, -- surrogate
customer_id VARCHAR(50), -- natural
customer_name VARCHAR(200),
segment VARCHAR(50),
valid_from DATE NOT NULL,
valid_to DATE DEFAULT '9999-12-31',
is_current BOOLEAN DEFAULT TRUE
);
-- Kundenhistorie:
-- key=1: Jan Novák, SMB, 2024-01-01 → 2025-06-30
-- key=2: Jan Novák, Enterprise, 2025-07-01 → 9999-12-31 (aktuell)
Type 2 in dbt¶
-- dbt Snapshot für SCD Type 2
{% snapshot customer_snapshot %}
{{ config(
target_schema='snapshots',
unique_key='customer_id',
strategy='check',
check_cols=['customer_name', 'segment', 'email'],
) }}
SELECT * FROM {{ source('raw', 'customers') }}
{% endsnapshot %}
Type 3 — Spalte hinzufügen¶
Eine Spalte wird für den vorherigen Wert (previous_segment) hinzugefügt. Eingeschränkte Historie.
Zusammenfassung¶
SCD Type 2 ist am weitesten verbreitet — vollständige Historie mit valid_from/to. dbt Snapshots automatisieren die Implementierung.