ゆっくりまたは予測できないほど変化するディメンションデータは、Slowly Changes Dimensions(SCD)分析でキャプチャされます。データウェアハウス環境では、ディメンションテーブルには、ディメンションデータと呼ばれる各レコードやその他の情報を一意に識別する主キーがあります。
さまざまなSCDタイプのすべての更新方法は、IRICoSortのSortCLプログラムを使用して実行できます。 IRI Voracityには、SortCLプログラムの実行時に使用されるSCDジョブスクリプトの作成を支援するウィザードがあります。ほとんどのバリエーションでは、完全な外部結合を使用して、元のマスターデータソースのレコードを、それぞれのキーの同等化に基づいて更新されたソースのレコードと照合します。一致するレコードは、マスターで更新する必要があります。一致するものがない更新ソースのレコードをマスターに追加する必要があります。
これは、製品コストを維持しているSCDType3を使用してディメンションファイルを更新する方法の概要です。更新は、フィールド ProductCodeに関して参加することで行われます。 。
タイプ3SCD
タイプ3モデルでは、現在のデータと履歴データが同じレコードに記録されます。決定する重要なことの1つは、どれだけの履歴を保持する必要があるかです。この例では、3つの開始日のコストを保持します。終了日は、レコードのコストが有効でなくなった日付です。それでも費用が有効な場合は、 EndDate1 フィールドは99991231に設定されます。これは、このフィールドの値が空にならないようにするためです。開始マスターソース(master3.dat)に含まれる値は次のとおりです。
| ProductCode | StartDate1 | EndDate1 | StartDate2 | EndDate2 | StartDate3 | EndDate3 | |||
|---|---|---|---|---|---|---|---|---|---|
| C123 | 125.50 | 20110228 | 99991231 | ||||||
| F112 | 2365.00 | 20120101 | 99991231 | ||||||
| G101 | 19.25 | 20110930 | 99991231 | 21.25 | 20110501 | 20110930 | |||
| J245 | 450.50 | 20110430 | 99991231 | 425.25 | 20101001 | 20110430 | 385.25 | 20100215 | 20101001 |
| S022 | 98.75 | 20110515 | 99991231 |
更新レコードはすべて同じ開始日を持っています。 update.datソースには、レコードの次のフィールド値が含まれています。
| ProductCode | StartDate | |
|---|---|---|
| F112 | 2425.00 | 20120701 |
| J245 | 550.50 | 20120701 |
| M447 | 101.75 | 20120701 |
| S022 | 101.75 | 20120701 |
以下は更新されたデータです。更新されたレコードごとに、各コスト、開始日、および終了日が1セットずつ右に移動されます。レコードの古い現在のグループでは、終了日が新しく更新された現在のセットの開始日に変更されます。古い3番目のセットの値はすべて破棄されます。
| ProductCode | StartDate1 | EndDate1 | StartDate2 | EndDate2 | StartDate3 | EndDate3 | |||
|---|---|---|---|---|---|---|---|---|---|
| C123 | 125.50 | 20110228 | 9991231 | ||||||
| F112 | 2425.00 | 20120701 | 9991231 | 2365.00 | 20120101 | 20120701 | |||
| G101 | 19.25 | 20110930 | 9991231 | 21.25 | 20110501 | 20110930 | |||
| J245 | 550.50 | 20120701 | 9991231 | 450.50 | 20110430 | 20120701 | 425.25 | 20101001 | 20110430 |
| M447 | 101.75 | 20120701 | 9991231 | ||||||
| S022 | 101.75 | 20120701 | 9991231 | 98.75 | 20110515 | 20120701 |
IRI Workbenchには、ディメンションファイルとテーブルを更新するためのスクリプトの作成を支援するVoracityウィザードがあります。このウィザードは、ナビゲーションバーの[Voracity]ドロップダウンにあります。まず、SCDタイプを選択します。次に、更新の処理に使用するファイルを選択するウィンドウが表示されます。
次の画面の一番上のテーブルで、更新されるデータがマスターにどのようにマップされるかを決定します。画面の中央のグループで、更新中のレコードのステータス値を示すフィールドを選択します。
現在の下のドロップダウン および履歴フィールドセット 、最初に定義するセットは、現在の値のフィールド名を示します。 値フィールド 更新されるディメンション値です。 スタートフィールド 値フィールドがいつになるかを決定するフィールドです アクティブになり、エンドフィールド いつ無効になるかを決定します。次に、保持されている履歴値の数に必要な数のセットを定義します。
マスターファイルを更新するジョブスクリプトは次のとおりです。
/INFILE=master3.dat
/PROCESS=DELIMITED
/ALIAS=master3
/FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
/FIELD=(COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
/FIELD=(STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",")
/FIELD=(ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",")
/FIELD=(COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
/FIELD=(STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",")
/FIELD=(ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",")
/FIELD=(COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
/FIELD=(STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
/FIELD=(ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
/INFILE=update.dat
/PROCESS=DELIMITED
/ALIAS=update
/FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
/FIELD=(COST, TYPE=ASCII, POSITION=2, SEPARATOR=",", FRAME='\"')
/FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"')
/JOIN FULL_OUTER master3 update WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE
/OUTFILE=master3.dat
# Include only records that are to be updated
/PROCESS=DELIMITED
/FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
/FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
/FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",")
/FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",")
/FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
/FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=6, SEPARATOR=",")
/FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=7, SEPARATOR=",")
/FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
/FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
/FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
/INCLUDE WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE
/OUTFILE=master3.dat
# Include only records that are not to be updated
/PROCESS=DELIMITED
/FIELD=(MASTER3.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
/FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
/FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",")
/FIELD=(MASTER3.ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",")
/FIELD=(MASTER3.COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",")
/FIELD=(MASTER3.STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",")
/FIELD=(MASTER3.ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",")
/FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",")
/FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",")
/FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",")
/OMIT WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE
/OMIT WHERE MASTER3.PRODUCTCODE EQ ""
/OUTFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD3/master3.dat
# Add new records
/PROCESS=DELIMITED
/FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",")
/FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",")
/FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",")
/FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",")
/INCLUDE WHERE MASTER3.PRODUCTCODE EQ "" AND UPDATE.PRODUCTCODE NE ""