SCD-2マスタービルダー
ソーステーブルから、ゆっくり変化するディメンション タイプ2(SCD-2) の履歴テーブルを構築します。通常のマスターテーブルは、各キーについて現在の値だけを保持しますが、SCD-2テーブルは、キーがこれまでに持っていたすべての値を、有効だった日付範囲とともに保持します。これにより、「この顧客は現在どの地域にいるか」だけでなく、「トランザクションの当日、この顧客はどの地域にいたか」といった、ある時点に関する問いに答えられます。
実行のたびに、ソースのスナップショットと以前の履歴を比較し、追跡対象の属性が変更されたキーについて、古いバージョンを閉じて新しいバージョンを開きます。テーブルは再計算されてアトミックに入れ替えられるため、同じ入力で再実行すると同じ結果になります。
このステップをSCD-2時点指定結合と組み合わせると、ある時点の値をファクトテーブルに付与できます。
実行のたびに、引き継ぎ列に加えて、予約済みの3つの列が出力されます。これらに名前を付ける必要はありません。常にvalid_from、valid_to、is_currentであり、ビジネスキー列や追跡対象の列にこれらの名前を使用することはできません。
| 列 | 意味 |
|---|---|
valid_from |
このバージョンが有効になった日付(含む)。 |
valid_to |
このバージョンが有効でなくなった日付(含まない)。オープン(現在)の行は、センチネルの上限日9999-12-31を持ちます。 |
is_current |
現在有効なバージョンはtrue、閉じた履歴はfalseです。 |
ソーステーブル
Section titled “ソーステーブル”マスターデータの現在のスナップショットです。ビジネスキーごとに1行で、現在の属性値を保持します。
Prior SCD-2 Table(オプション)
Section titled “Prior SCD-2 Table(オプション)”前回の実行で作成された既存の履歴テーブルです。初回実行時は空のままにする(または結果テーブルを指定する)と、ステップは履歴をゼロから構築し、ソースの行ごとに、発効日付きでバージョンを1つ開きます。
結果テーブル
Section titled “結果テーブル”再構築された履歴の書き込み先です。ビューではなくテーブルである必要があります。
発効日とオプション
Section titled “発効日とオプション”実行のたびに、変更は単一の発効日で記録されます。次の2つのうち、いずれか一方のみで指定します。両方を指定した場合も、どちらも指定しない場合も、エラーになります。
- 発効日列 — ソース内の、発効日を保持する列です。すべてのソース行で同じ値である必要があります(スナップショットは1つの日付時点のものです)。
- 発効日 —
YYYY-MM-DD形式の固定の日付、または{current_month}のような変数で、実行全体に適用されます。
その他のオプションです。
- オープン区間の上限日 — オープンの行の
valid_toに書き込まれるセンチネルです。デフォルトは9999-12-31です。変更する理由はほとんどなく、SCD-2時点指定結合で使用する上限日と一致している必要があります。 - Close on Absence — 有効にすると、ソースから消えたキーのオープンバージョンが発効日に閉じられます(キーは廃止されたものとして扱われます)。無効(デフォルト)の場合、ソースにないキーは既存のオープンバージョンを保持するため、部分的な抽出によって履歴が失われることはありません。
このステップは、YYYY-MM-DD形式の実在する日付ではない固定の発効日またはオープン区間の上限日、および上限日以降の発効日の保存を拒否します。変数として指定された日付はチェックされません。
ソースを検査を使ってソース列を一覧表示し、各列にタグを付けます。
| ロール | 意味 |
|---|---|
| ビジネスキー | 時間を通じて行を識別する自然キーです(例: customer_id)。少なくとも1つが必要です。値はソース内で一意で、nullでない必要があります。 |
| 追跡属性 | 変更されると新しいバージョンを開く属性です(例: region)。少なくとも1つが必要です。 |
| (引き継ぐ) | タグのない列は、各バージョンにそのままコピーされ、それ自体では新しいバージョンのトリガーにはなりません。 |
マージの動作
Section titled “マージの動作”以前のテーブルが指定されている場合、ステップはソースのスナップショットを現在のバージョンのみ(閉じた履歴は対象外)と比較し、キーごとに次のように判断します。
| 状況 | 結果 |
|---|---|
| 追跡対象の属性が変更されていない | 何もしません。オープンバージョンはそのままです。 |
| 追跡対象の属性が変更された | オープンバージョンが発効日に閉じられ、新しいオープンバージョンが挿入されます。 |
発効日がオープンバージョンのvalid_fromと等しい |
同日の訂正として扱われます。幅ゼロの区間を作らず、追跡対象の値がその場で上書きされます。 |
| キーがソースにない | オープンのままにします(Close on Absenceが有効な場合は、発効日に閉じます)。 |
履歴を暗黙的に破損させずに、実行を停止するガードレールです。
- 順序が逆の日付は拒否されます。 発効日は、影響を受ける各キーの現在の
valid_fromより後である必要があります。区間が反転してしまう過去日付の実行は、幅が負のバージョンを生成せず、エラーで失敗します。 - ソースのキーの重複は拒否されます。 ソースはビジネスキーで一意である必要があります。重複(またはnullのキー)は、暗黙的に重複排除されず、失敗します。
- 変更検出はnullセーフであるため、値が空になる、または空から変わる場合も、正しく変更として記録されます。
各顧客が時間の経過とともにどの地域に属していたかを追跡します。
ソース — customer_master(2026-01-01時点):
| customer_id | region | segment |
|---|---|---|
| C1 | 西部 | SMB |
| C2 | 東部 | エンタープライズ |
初回実行: ソーステーブル = customer_master、Prior SCD-2 Table = 空、結果テーブル = customer_scd2、発効日 = 2026-01-01、ビジネスキー = customer_id、追跡属性 = region(segmentはタグなしで、そのまま引き継がれます)。
初回実行後のcustomer_scd2:
| customer_id | region | segment | valid_from | valid_to | is_current |
|---|---|---|---|---|---|
| C1 | 西部 | SMB | 2026-01-01 | 9999-12-31 | true |
| C2 | 東部 | エンタープライズ | 2026-01-01 | 9999-12-31 | true |
ここで、C1が中部地域に移動します。ソース — customer_master(2026-04-01時点):
| customer_id | region | segment |
|---|---|---|
| C1 | 中部 | SMB |
| C2 | 東部 | エンタープライズ |
2回目の実行: テーブルのロールは同じで、Prior SCD-2 Table = customer_scd2、発効日 = 2026-04-01。
2回目の実行後のcustomer_scd2:
| customer_id | region | segment | valid_from | valid_to | is_current |
|---|---|---|---|---|---|
| C1 | 西部 | SMB | 2026-01-01 | 2026-04-01 | false |
| C1 | 中部 | SMB | 2026-04-01 | 9999-12-31 | true |
| C2 | 東部 | エンタープライズ | 2026-01-01 | 9999-12-31 | true |
C1の西部バージョンは2026-04-01に閉じられ、中部バージョンが開かれました。半開区間であるため、2026-04-01付けのトランザクションは西部ではなく中部に属します。C2は変更されておらず、そのままです。
- SCD-2時点指定結合 — ある時点の値をファクトテーブルに付与します。
- Dimension Loadステップ — テーブルから階層をロードします。