SCD Type2にて既存行より有効開始日が古いデータが到着した場合の取り扱い
SCD Type2にて既存行より有効開始日が古い(または同じ日付の)データが到着した場合の取り扱いを考えてみました。
前提:この方式を採用
■Design Tip #107 Using the SQL MERGE Statement for Slowly Changing Dimension Processing
http://www.kimballgroup.com/html/08dt/KU107_UsingSQL_MERGESlowlyChangingDimension.pdf
既存行(Target)
ビジネスキー 有効開始日 有効終了日 最新フラグ
AAA 2011/01/01 2011/03/31 N
AAA 2011/04/01 2011/05/24 N
AAA 2011/05/25 9999/12/31(とかNULLとか) Y
到着したデータ(Source)
ビジネスキー 有効開始日
AAA 2011/02/01
※有効開始日の決定方法は何でもよいが(基幹側からの指定日(未来日付を含む)、処理日、処理日の前日、処理みなし日、...)、とにかく特定の日付が有効開始日として指定されたとする。
案A:無視する
上記PDFの、Type2の9行目: WHEN MATCHED AND CM.Current_Flag = 'y' を変更する。
→WHEN MATCHED ND CM.Current_Flag = 'y' AND Source.有効開始日 > Target.有効開始日
案B:拒否する
事前に(Source)と(Target)の最新有効行を比較して、RAISERRORですね...
案C:許容する
上記PDFの、Type2の9行目: WHEN MATCHED AND CM.Current_Flag = 'y' を変更する。
→WHEN MATCHED AND Source.有効終了日 > Target.有効終了日(有効開始日の前日)
上記PDFの、Type2の14行目:WHERE MERGE_OUT.Action_Out = 'UPDATE'; を変更する。
→WHERE MERGE_OUT.Action_Out = 'UPDATE' AND Source.有効開始日 < Target.有効開始日
ビジネスキー 有効開始日 有効終了日
AAA 2011/01/01 2011/01/31 ←有効終了日が更新、有効期間の短縮化
AAA 2011/04/01 2011/01/31 ←有効終了日が更新、無効化、削除してよい
AAA 2011/05/25 2011/01/31 ←有効終了日が更新、無効化、削除してよい
AAA 2011/02/01 9999/12/31(とかNULLとか)
※有効期間に変化があるため、影響のあるファクト側のサロゲートキーのルックアップの再処理が必要です。
うーん、めんどくさい。