ゆっくりまたは予測できないほど変化するディメンションデータは、Slowly Changes Dimensions(SCD)分析でキャプチャされます。データウェアハウス環境では、ディメンションテーブルには、ディメンションデータと呼ばれる各レコードやその他の情報を一意に識別する主キーがあります。
さまざまなSCDタイプのすべての更新方法は、IRICoSortのSortCLプログラムを使用して実行できます。 IRI Voracityには、SortCLプログラムの実行時に使用されるSCDジョブスクリプトの作成を支援するウィザードがあります。ほとんどのSCDタイプは、完全外部結合を使用して、元のデータソースのレコードを、それぞれのキーの同等化に基づいて更新ソースのレコードと照合します。一致するレコードは、マスターで更新する必要があります。一致するものがない更新ソースのレコードをマスターに追加する必要があります。
これは、製品コストを維持しているSCDType2を使用してディメンションファイルを更新する方法の概要です。更新は、フィールド ProductCodeに関して結合することによって行われます。 。
タイプ2SCD
このモデルでは、現在のレコードと履歴レコードが同じファイルに保持されます。アクティブなデータベースでは、 ProductCode に加えて、ファクトテーブルにリンクするための主キーとして使用する代理キーがある可能性があります。 更新プロセスに使用されるキー。現在のレコードと履歴レコードは同じファイルに含まれているため、レコードが ProductCodeの現在のレコードであるかどうかを示すフィールドが必要です。 ProductCodeのコストを示すフィールドが必要です もはや効果的ではありません。この例では、次のようになります。
- ProductCode :これは識別子キーフィールドです。
- コスト : StartDateに有効になった費用 記録のために。
- StartDate :これは、レコードのコストが有効になった日付です。
- EndDate :これは、コストが発生した日付です。 レコード内はもはや効果的ではありません。コストがまだ有効な場合、EndDateは99991231に設定されます。これは、このフィールドのnull値を回避するためです。
- 現在 :コストがまだ有効な場合はY、有効でない場合はN。
開始テーブルには、すでに3つの履歴レコードがあります。これらは、フィールド Currentの値がNであるものです。 。マスターソースはmaster2.datと呼ばれ、以下のデータが含まれています。
ProductCode | StartDate | EndDate | ||
---|---|---|---|---|
C123 | 125.50 | 20110228 | 99991231 | |
F112 | 2365.00 | 20120101 | 99991231 | |
G101 | 19.25 | 20110930 | 99991231 | |
G101 | 21.25 | 20110501 | 20110930 | N |
J245 | 450.50 | 20110430 | 99991231 | |
J245 | 425.25 | 20101001 | 20110430 | N |
J245 | 385.25 | 20100215 | 20101001 | N |
S022 | 98.75 | 20110515 | 99991231 |
更新レコードはすべて同じStartDate 。 update.datソースには、次のフィールド値を持つレコードが含まれています。
ProductCode | StartDate | |
---|---|---|
F112 | 2425.00 | 20120701 |
J245 | 550.50 | 20120701 |
M447 | 101.75 | 20120701 |
S022 | 101.75 | 20120701 |
IRI Workbenchには、ディメンションファイルとテーブルを更新するためのスクリプトの作成を支援するVoracityウィザードがあります。このウィザードは、ナビゲーションバーの[Voracity]ドロップダウンにあります。まず、SCDタイプを選択します。次に、更新の処理に使用されるソースを選択するウィンドウが表示されます。タイプ2の場合、ターゲットは通常、元のマスターファイルまたはテーブルです。
次の画面で、更新データがどのようにマッピングされ、他のフィールドまたは列の値がどのように設定されるかを決定します。 update.Cost Master2.costにマップされます とアップデート。 StartDate master2.StartDateにマップされます 。 フラグフィールド アクティブなコストを持つレコードを決定するために使用されるフィールドです。つまり、レコード内の値がアクティブであるか履歴であるかです。この場合、フラグフィールド フィールドCurrent 。 フラグの正の値 Currentの値です コストかどうかを決定します 現在のコストです;この例では、値は「Y」であり、フラグの負の値 「N」です。終了フィールドには、レコードのコストが有効でなくなった時期と Master.EndDateを決定するために使用される値を保持するフィールドの名前が含まれます。 その値を保持します。 最終値 終了フィールドの値として使用されます レコードにProductCodeの現在の値が含まれている場合 。
次の画面は、マスターソースと更新ソースで実行される結合を定義するためのものです。 ProductCode に関しては、両方のソースを注文する必要があることに注意してください。 。そうでない場合は、 NOT_SORTEDを選択する必要があります 並べ替え注文オプションのドロップダウン 並べ替える必要のあるデータソースの下。
ジョブスクリプトは次のとおりです。
/INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD2/master2.dat /PROCESS=DELIMITED /ALIAS=master2 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/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 master2 update WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master2.dat # Include only records that are being updated # Use the Cost and StartDate from the Update file /PROCESS=DELIMITED /FIELD=(MASTER2.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.CURRENT, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ “Y" /OUTFILE=master2.dat # Change any current records that are being updated to history records # by giving the EndDate as the StartDate from the update record # and changing the field Current to N /PROCESS=DELIMITED /CONDITION=(MATCH, TEST=(MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ "Y")) /FIELD=(MASTER2.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"', IF MATCH THEN UPDATE.STARTDATE ELSE MASTER2.ENDDATE) /FIELD=(CURRENT_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MATCH THEN "N" ELSE MASTER2.CURRENT) /OMIT WHERE MASTER2.PRODUCTCODE EQ "" /OUTFILE=master2.dat # Add new records /PROCESS=DELIMITED /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE UPDATE.PRODUCTCODE NE "" AND MASTER2.PRODUCTCODE EQ ""
新しいマスターファイルの値は次のとおりです。
ProductCode | StartDate | EndDate | ||
---|---|---|---|---|
C123 | 125.50 | 20110228 | 99991231 | |
F112 | 2425.00 | 20120701 | 99991231 | |
F112 | 2365.00 | 20120101 | 20120701 | N |
G101 | 19.25 | 20110930 | 99991231 | |
G101 | 21.25 | 20110501 | 20110930 | N |
J245 | 550.50 | 20120701 | 99991231 | |
J245 | 450.50 | 20110430 | 20120701 | N |
J245 | 425.25 | 20101001 | 20110430 | N |
J245 | 385.25 | 20100215 | 20101001 | N |
M447 | 101.75 | 20120701 | 99991231 | |
S022 | 101.75 | 20120701 | 99991231 | |
S022 | 98.75 | 20110515 | 20120701 | N |