2013-04-11 52 views
0

的請看看下面的臨時表。它有相同策略的多行。 此表中的數據是從我從外部來源收到的平面文件加載的。別樣增量加載

列值可以一列之間切換到下一行。參見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 
) 

通常我會寫一個MERGE語句或SSIS包處理增量加載和SCD的尺寸,但由於原來的記錄和更改記錄在同一文件標準方法不起作用。

我會很感激,如果你可以扔在如何處理這部分光。我試圖避免逐行操作。

感謝, 薩姆。

+1

我最初的辦法是看由源數據分割成一套獨特PolicyKey,然後一組重複來解決這個問題。這兩個數據集都需要在加載過程中根據數據庫進行檢查。所以,轉儲所有到一個臨時表,然後做一些像我的[刪除第一](http://stackoverflow.com/questions/15503959/ssis-foreach-through-a-table-insert-into-another-and- delete-the-source-row/15508174#15508174)方法在for循環中獲取唯一鍵,然後是其餘部分。讓我知道你是否希望我試圖將這個問題轉化爲正確的答案 – billinkc 2013-04-11 18:11:24

+0

謝謝比爾。這是一個好主意,雖然不是「先刪除」登臺表,但是我通過添加一個額外的列並使用它來標記要處理的循環並循環它們來支持分段。你想發表你的評論作爲答案,我會將其標記爲答案。再次感謝! – 2013-04-17 23:36:12

回答

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 

請讓我們知道,如果這有助於你。