0

次のステージング テーブルを見てください。同じポリシーに対して複数の行があります。このテーブルへのデータは、外部ソースから受け取ったフラット ファイルから読み込まれます。

列の値は、1 つの行と次の行の間で変化する可能性があります。ColA を参照してください。最初の行に入力される列が限られている場合があります。次の行にさらに列が入力されます。列 ColB と ColC を参照してください。これらは最初は null で、2 行目と 3 行目に入力されます。

`CREATE TABLE #Stg
(
  PolicyNum VARCHAR(10) ,
  ColA VARCHAR(10) ,
  ColB VARCHAR(10) ,
  ColC VARCHAR(10) ,
  TimeStampKey VARCHAR(100)
)

INSERT  #Stg
    ( PolicyNum, ColA, ColB, ColC, TimeStampKey )
VALUES  ( 'MDT1000', 'SomeVal_A1', NULL, NULL, '2013041113033140MDT1000ZA' )
    ,
    ( 'MDT1000', 'SomeVal_A2', 'SomeVal_B', NULL, '2013041113051756MDT1000ZA' )
    ,
    ( 'MDT1000', 'SomeVal_A3', 'SomeVal_B', 'SomeVal_C', '2013041113115418MDT1000ZA' )`

このステージング テーブルから、履歴を維持しながら宛先テーブルにデータをロードする必要があります。宛先テーブルは、基本的にタイプ 2 の緩やかに変化するディメンションです。つまり、最初の行が存在しないためステージングからロードし、2 行目で更新し、3 行目で再度更新します。

以下は、宛先スキーマの例です。

CREATE TABLE #Dst
(
PolicyKey INT IDENTITY(1,1) PRIMARY KEY
, PolicyNum VARCHAR(10)
, ColA VARCHAR(10) 
, ColB VARCHAR(10)
, ColC VARCHAR(10)
, IsActive BIT
, RowStartDate DATETIME
, RowEndDate DATETIME
)

通常、増分ロードと scd ディメンションを処理するためにマージ ステートメントまたは SSIS パッケージを作成しますが、元のレコードと変更レコードが同じファイルにあるため、標準的な方法は機能しません。

これにアプローチする方法に光を当てることができれば幸いです。行ごとの操作を避けようとしています。

ありがとう、サム。

4

1 に答える 1

0

これを試して:

SELECT 
  Stg.*
FROM Stg 
INNER JOIN 
(
    SELECT PolicyNum, MAX (TimeStampKey) AS MAX_TimeStampKey 
    FROM Stg
    GROUP BY PolicyNum 
 ) T 
 ON T.PolicyNum = Stg.PolicyNum
 AND T.MAX_TimeStampKey = Stg.TimeStampKey

結果:

 PolicyNum  ColA       ColB       ColC       TimeStampKey
 ---------- ---------- ---------- ---------- -------------------
 MDT1000    SomeVal_A3 SomeVal_B  SomeVal_C  2013041113115418MDT1000ZA

これが役に立ったかどうかお知らせください。

于 2013-04-12T11:17:21.073 に答える