sql >> データベース >  >> RDS >> Database

SCDタイプ2

    ゆっくりまたは予測できないほど変化するディメンションデータは、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と呼ばれ、以下のデータが含まれています。

    コスト 現在 Y Y Y Y Y
    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 ""

    新しいマスターファイルの値は次のとおりです。

    コスト 現在 Y Y Y Y Y Y
    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

    1. PostgreSQLテーブル統計の分析

    2. MariaDBでのSTRCMP()のしくみ

    3. SQL Server(T-SQL)でパーティション化されたテーブルのパーティション化列を検索する

    4. ユーザー設定のためのデータベース設計