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とか)

※有効期間に変化があるため、影響のあるファクト側のサロゲートキーのルックアップの再処理が必要です。


うーん、めんどくさい。