はじめに
・Snowflakeの環境を使います。
・使用データのNAME列の名前は生成AIで作成しており、実在する人物とは関係ありません。
・データベース名は「TEST」としています。
・ID,名前(NAME),部署名(DEPARTMENT)をユニークキーとします。
今回の検証内容
マスタデータを管理する際に以下2点の処理を実装する。
・古いマスタデータを論理削除
・新しいマスタデータを追加
使用データと処理後の期待値
・使用するデータ(スキーマ名.テーブル名)
RAWスキーマのテーブル:最新のマスタデータ
MSTスキーマのテーブル:既存のマスタデータ

・処理後の期待値(スキーマ名.テーブル名)

想定されるマスタデータ更新とデータ追加のパターン

処理フロー
以下のような流れで処理をしていきます。データ転送の部分は今回は割愛します。

クエリ
まず最初にクエリの完成形を記載して、その後に処理の内容を記載していきます!
完成版クエリ
-- Step1: MST.MASTERテーブルにある古いマスタデータのEND_DATEを更新
MERGE INTO TEST.MST.MASTER AS target_master
USING (
SELECT
inactive_records.ID,
inactive_records.NAME,
inactive_records.DEPARTMENT,
new_data.IMPORT_DATE
FROM (
SELECT
active_master.ID,
active_master.NAME,
active_master.DEPARTMENT
FROM (SELECT * FROM TEST.MST.MASTER WHERE END_DATE IS NULL) AS active_master
LEFT JOIN TEST.RAW.MASTER AS current_raw
ON active_master.ID = current_raw.ID
AND active_master.NAME = current_raw.NAME
AND active_master.DEPARTMENT = current_raw.DEPARTMENT
WHERE current_raw.ID IS NULL
) AS inactive_records
LEFT JOIN TEST.RAW.MASTER new_data
ON inactive_records.ID = new_data.ID
) AS update_source
ON target_master.ID = update_source.ID
AND target_master.NAME = update_source.NAME
AND target_master.DEPARTMENT = update_source.DEPARTMENT
WHEN MATCHED THEN
UPDATE SET END_DATE = DATEADD(day, -1, update_source.IMPORT_DATE);
-- Step2: MST.MASTERテーブルに新しいマスタデータを追加
MERGE INTO TEST.MST.MASTER AS target_master
USING TEST.RAW.MASTER AS source_master
ON target_master.ID = source_master.ID
AND target_master.NAME = source_master.NAME
AND target_master.DEPARTMENT = source_master.DEPARTMENT
WHEN NOT MATCHED THEN
INSERT (ID, NAME, DEPARTMENT, START_DATE, END_DATE)
VALUES (source_master.ID, source_master.NAME, source_master.DEPARTMENT, source_master.IMPORT_DATE, NULL);
解説
以下の画像の①~⑤に分けて解説していきます。

①MSTスキーマのMASTERテーブルから更新対象となりうるレコードを抽出する
-「END_DATE」がNULLのデータを抽出

②MSTスキーマのMASTERテーブルの更新対象となるレコードを抽出する
- ①で抽出した「active_master」を基準にRAWスキーマのMASTERテーブルと左外部結合
結合キーはID,NAME,DEPARTMENT

- RAWスキーマのMASTERテーブルには結合対象がないレコードのみを抽出

- 抽出したレコードからID,NAME,DEPARTMENTのカラムのみを抽出

③古いマスタデータの「END_DATE」の値を更新するために、新しいマスタデータの「IMPORT_DATE」を抽出する
- ②で抽出した「inactive_records」を基準にRAWスキーマのMASTERテーブルと左外部結合
結合キーはID

- 抽出したレコードからID,NAME,DEPARTMENT,IMPORT_DATEのカラムのみを抽出

④MSTスキーマのMASTERテーブルにある古いマスタデータの「END_DATE」の値を更新する
- MSTスキーマのMASTERテーブル(target_master)を③で抽出したupdate_sourceの値に基づいて更新する
ID,NAME,DEPARTMENTの値が一致している場合、そのレコードの「END_DATE」の値を更新する
更新する値は「IMPORT_DATE」の1日前

⑤MSTスキーマのMASTERテーブルに新しいマスタデータを追加する
- MSTスキーマのMASTERテーブル(target_master)をRAWスキーマのMASTERテーブル(source_master)の値に基づいてレコードを挿入する
ID,NAME,DEPARTMENTの値が一致しない場合、そのレコードを挿入する
挿入するレコードのカラムと値は以下の通り

処理の結果は以下の通り

最後に
2Stepで実装しましたが、実際に対応した時はTROCCOのデータマート定義にクエリを2つとも記載しました。
今回の内容は以上になります。
ご覧いただきありがとうございました。

