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

SCDタイプ6

    ゆっくりまたは予測できないほど変化するディメンションデータは、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つあり、以下に示す値があります。

    コスト 現在 Y
    ProductCode HistoricalCost StartDate EndDate
    J245 385.25 385.25 20100215 99991231

    新しいコストを実装する必要がある場合、更新レコードの値を使用して、新しい現在のレコードを追加します。 CurrentCost 製品コードJ245のすべてのレコードは、コストに変更されます。 HistoricalCost中の更新レコードからの値 既存のレコードについては同じままです。さらに、 EndDate 古い現在のレコードはStartDateに変更されます 新しい現在のレコードのために。 ProductCodeのレコード J245、 CurrentCost 更新されたマスターファイルのフィールドの値は次のとおりです。

    コスト 現在 Y
    ProductCode HistoricalCost StartDate EndDate
    J245 425.25 425.25 20101001 99991231
    J245 425.25 385.25 20100215 20101001 N

    次に、次の新しいコストで更新し、J245レコードの次の値を取得します。

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

    最終更新では、次の値を持つレコードが作成されます。

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

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

    コスト 現在 Y Y Y Y Y
    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があります

    新しいマスターファイルは、次のような値を持つマスターファイルの下部に新しい現在のマスターレコードが追加されたため、並べ替えられません。

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

    1. SQLServerのPRINTステートメントの概要

    2. Rails + OSX上のMySQL:ライブラリがロードされていません:libmysqlclient.18.dylib

    3. MySQLの頻度からパーセンタイルを計算する

    4. SQLServerデータベースですべての外部キー制約を無効にする方法-SQLServer/TSQLチュートリアルパート77