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

SCDタイプ3

    ゆっくりまたは予測できないほど変化するディメンションデータは、Slowly Changes Dimensions(SCD)分析でキャプチャされます。データウェアハウス環境では、ディメンションテーブルには、ディメンションデータと呼ばれる各レコードやその他の情報を一意に識別する主キーがあります。

    さまざまなSCDタイプのすべての更新方法は、IRICoSortのSortCLプログラムを使用して実行できます。 IRI Voracityには、SortCLプログラムの実行時に使用されるSCDジョブスクリプトの作成を支援するウィザードがあります。ほとんどのバリエーションでは、完全な外部結合を使用して、元のマスターデータソースのレコードを、それぞれのキーの同等化に基づいて更新されたソースのレコードと照合します。一致するレコードは、マスターで更新する必要があります。一致するものがない更新ソースのレコードをマスターに追加する必要があります。

    これは、製品コストを維持しているSCDType3を使用してディメンションファイルを更新する方法の概要です。更新は、フィールド ProductCodeに関して参加することで行われます。 。

    タイプ3SCD

    タイプ3モデルでは、現在のデータと履歴データが同じレコードに記録されます。決定する重要なことの1つは、どれだけの履歴を保持する必要があるかです。この例では、3つの開始日のコストを保持します。終了日は、レコードのコストが有効でなくなった日付です。それでも費用が有効な場合は、 EndDate1 フィールドは99991231に設定されます。これは、このフィールドの値が空にならないようにするためです。開始マスターソース(master3.dat)に含まれる値は次のとおりです。

    コスト1 コスト2 コスト3
    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番目のセットの値はすべて破棄されます。

    コスト1 コスト2 コスト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 ""

    1. MYSQLのサブクエリでLIMITキーワードを使用する代わりに

    2. パフォーマンスの驚きと仮定:STRING_SPLIT()

    3. SQLServerで複数のNULL値を許可する一意の制約を実装する適切な方法

    4. OracleでのLIKEを使用したアクセントと大文字と小文字を区別しない照合