ゆっくりまたは予測できないほど変化するディメンションデータは、Slowly Changes Dimensions(SCD)分析でキャプチャされます。データウェアハウス環境では、ディメンションテーブルには、ディメンションデータと呼ばれる各レコードやその他の情報を一意に識別する主キーがあります。
さまざまなSCDタイプのすべての更新方法は、IRICoSortのSortCLプログラムを使用して実行できます。 IRI Voracityには、SortCLプログラムの実行時に使用されるSCDジョブスクリプトの作成を支援するウィザードがあります。ほとんどのバリエーションでは、完全な外部結合を使用して、元のデータソースのレコードを、それぞれのキーの同等化に基づいて更新されたソースのレコードと照合します。一致するものがない更新ソースのレコードをマスターに追加する必要があります。
これは、製品コストを維持しているSCDType6を使用してディメンションファイルまたはテーブルを更新する方法の概要です。更新は、フィールド ProductCodeに関して結合することによって行われます。 。
タイプ6SCD
タイプ6は、タイプ1、タイプ2、およびタイプ3を組み合わせたハイブリッドです。1+ 2 + 3 =6であるため、タイプ6と呼ばれます。各レコードには、次のフィールドがあります。
- ProductCode :これは識別子キーフィールドです。
- コスト :製品の現在のコスト。
- HistoricalCost :そのレコードの開始日に有効になったコスト。
- StartDate :HistoricalCostが有効になった日付。
- EndDate :レコードのHistoricalCostが現在のCurrentCostでなくなった日付。 HistoricalCostがまだ現在のコストである場合、EndDateは99991231です。
- 現在 :コストがまだ最新の場合はY、そうでない場合はN
とりあえず、 ProductCodeのレコードを見てみましょう。 J245。最も早いHistoricalCostから始めましょう 現在のコストでした。 HistoricalCostはCostと同じです。その場合、ProductCode J245のレコードが1つあり、以下に示す値があります。
ProductCode | HistoricalCost | StartDate | EndDate | |
---|---|---|---|---|
J245 | 385.25 | 385.25 | 20100215 | 99991231 |
新しいコストを実装する必要がある場合、更新レコードの値を使用して、新しい現在のレコードを追加します。 CurrentCost 製品コードJ245のすべてのレコードは、コストに変更されます。 HistoricalCost中の更新レコードからの値 既存のレコードについては同じままです。さらに、 EndDate 古い現在のレコードはStartDateに変更されます 新しい現在のレコードのために。 ProductCodeのレコード J245、 CurrentCost 更新されたマスターファイルのフィールドの値は次のとおりです。
ProductCode | HistoricalCost | StartDate | EndDate | ||
---|---|---|---|---|---|
J245 | 425.25 | 425.25 | 20101001 | 99991231 | |
J245 | 425.25 | 385.25 | 20100215 | 20101001 | N |
次に、次の新しいコストで更新し、J245レコードの次の値を取得します。
ProductCode | HistoricalCost | StartDate | EndDate | ||
---|---|---|---|---|---|
J245 | 450.50 | 450.50 | 20110430 | 99991231 | |
J245 | 450.50 | 425.25 | 20101001 | 20110430 | N |
J245 | 450.50 | 385.25 | 20100215 | 20101001 | N |
最終更新では、次の値を持つレコードが作成されます。
ProductCode | HistoricalCost | StartDate | EndDate | ||
---|---|---|---|---|---|
J245 | 550.50 | 550.50 | 20120701 | 99991231 | |
J245 | 550.50 | 450.50 | 20110430 | 20120701 | N |
J245 | 550.50 | 425.25 | 20101001 | 20110430 | N |
J245 | 550.50 | 385.25 | 20100215 | 20101001 | N |
更新前のマスターファイルの値は次のとおりです。
ProductCode | HistoricalCost | StartDate | EndDate | ||
---|---|---|---|---|---|
C123 | 125.50 | 125.50 | 20110228 | 99991231 | |
F112 | 2365.00 | 2365.00 | 20120101 | 99991231 | |
G101 | 19.25 | 19.25 | 20110930 | 99991231 | |
G101 | 19.25 | 21.25 | 20110501 | 20110930 | N |
J245 | 450.50 | 450.50 | 20110430 | 99991231 | |
J245 | 450.50 | 425.25 | 20101001 | 20110430 | N |
J245 | 450.50 | 385.25 | 20100215 | 20101001 | N |
S022 | 98.75 | 98.75 | 20110515 | 99991231 |
更新データはすべて同じ開始日になります 。 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タイプを選択します。次に、更新の処理に使用されるソースを選択するウィンドウが表示されます。タイプ6の場合、ターゲットは通常、元のマスターファイルまたはテーブルです。
次の画面で、更新データがどのようにマッピングされ、他のフィールドまたは列の値がどのように設定されるかを決定します。 update.Cost フィールドはmaster6.CurrentCostにマップされます およびupdate.StartDate フィールドはmaster6.StartDateにマップされます 。 フラグフィールド レコードに最新のフィールド値が含まれているかどうかを判別するために使用されるフィールドです。この場合、そのフィールドは master6.current 。最新のレコードの場合、 CurrentCost フィールドとHistoryCost フィールドは同じ値になります。 フラグの正の値 master6.Currentの値です これは、フィールド値が ProductCodeの最新の値であることを決定します。 。その場合、この例では値は「Y」であり、フラグの負の値 「N」です。 エンドフィールド レコードのコストが無効になる時期を決定するために使用される値を保持するフィールドの名前とMaster.EndDateが含まれます その値を保持します。 最終値 終了フィールドの値として使用されます レコードが最新の場合。
次の画面は、マスターソースと更新ソースで実行される結合を定義するためのものです。 ProductCode に関しては、両方のソースを注文する必要があることに注意してください。 。そうでない場合は、並べ替え注文オプションのドロップダウンでNOT_SORTEDを選択する必要があります 並べ替える必要のあるデータソースの下。
これが最初のジョブスクリプトです:
/INFILE=master6.dat /PROCESS=DELIMITED /ALIAS=master6 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /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 NOT_SORTED master6 update WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master6.dat # Make changes to records that have the same ProductCode # as records in the update file /PROCESS=DELIMITED /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MASTER6.CURRENT EQ "Y" THEN UPDATE.STARTDATE ELSE MASTER6.ENDDATE) /FIELD=(CURRENT_NEW="N", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master6.dat # Keep the records that have no updates /PROCESS=DELIMITED /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER6.CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /OMIT WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE /OMIT WHERE MASTER6.PRODUCTCODE EQ "" /OUTFILE=master6.dat # Add the records with new product codes /PROCESS=DELIMITED /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"') /OMIT WHERE UPDATE.PRODUCTCODE EQ "" /INCLUDE WHERE UPDATE.PRODUCTCODE
確認するには
- CurrentCostの値 共通のProductCodeを持つすべてのレコードで同じになります
- StartDate HistoricalCostの日付です 効果的になりました
- ProductCode の最新のレコードについては、
- CurrentCostの値 およびHistoricalCost 同じです
- EndDate は99991231です
- Currentの値 Yです
- 現在のレコードではないレコードの場合
- EndDate 次のより最近のコストの日付です 効果的になりました
- フィールド現在 値にNがあります
新しいマスターファイルは、次のような値を持つマスターファイルの下部に新しい現在のマスターレコードが追加されたため、並べ替えられません。
ProductCode | HistoricalCost | StartDate | EndDate | ||
---|---|---|---|---|---|
C123 | 125.50 | 125.50 | 20110228 | 99991231 | |
F112 | 2425.00 | 2365.00 | 20120101 | 20120701 | N |
G101 | 19.25 | 19.25 | 20110930 | 99991231 | |
G101 | 19.25 | 21.25 | 20110501 | 20110930 | N |
J245 | 550.50 | 450.50 | 20110430 | 20120701 | N |
J245 | 550.50 | 425.25 | 20101001 | 20110430 | N |
J245 | 550.50 | 385.25 | 20100215 | 20101001 | N |
S022 | 101.75 | 98.75 | 20110515 | 20120701 | N |
F112 | 2425.00 | 2425.00 | 20120701 | 99991231 | |
J245 | 550.50 | 550.50 | 20120701 | 99991231 | |
M447 | 139.25 | 139.25 | 20120701 | 99991231 | |
S022 | 101.75 | 101.75 | 20120701 | 99991231 |