不同种类的增量负载

时间:2013-04-11 17:47:25

标签: ssis

请查看以下登台表。它有多个行用于同一策略。 此表的数据是从我从外部来源收到的平面文件中加载的。

列值可以在一行到下一行之间变化。见ColA。第一行中可能填充的列数有限。将在下一行中填充更多列。参见ColB和ColC列,它们最初为空,并填充在第二行和第三行。

`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慢慢变换的维度。换句话说,我已经从分段加载第一行,因为它不存在,并用第二行更新它,并再次用第三行更新。

Folliwing是目标架构的一个示例:

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
)

通常我会编写一个合并语句或一个SSIS包来处理增量加载和scd维度,但由于原始记录和更改记录在同一个文件中,因此标准方法不起作用。

如果你能说明如何解决这个问题,我将不胜感激。我试图避免逐行操作。

谢谢, 萨姆。

1 个答案:

答案 0 :(得分: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

如果这有助于您,请告诉我们。