2010-06-10 19 views
3

最近我一直在處理項目,需要從EDW表填充尺寸表。加載尺寸表 - 方法論

EDW表是屬於類型II,確實保留了歷史數據。何時加載Dim Table,其源可能是多個EDW表,或者是具有多級旋轉功能(屬性)的單個表。

意味着:將會有10條記錄 - 每條屬性需要在domain_code上旋轉以在Dim中創建單行。在這10條記錄中,會有一些屬性具有相同的domain_code,但具有不同的sub_domain_code,這需要進一步在子域代碼上進行旋轉。

例:

如果我得到域碼:01,02,03 =>它是直鏈樞軸上域碼 我也將具有域碼:10與子域碼/版本2006,2007,2008 ,2009

這意味着我需要將具有上述屬性的源表分成兩個=>一個用於域代碼,另一個用於domain_code +版本。

迄今爲止好。

當談到加載維度表:

按照設計規格的尺寸(最初由第三方編寫的),他們想要的是:

在EDW(屬性)的每一個變化,它應該組裝所有相關記錄(對於那個NK)意味着新的與其他屬性值是當前=>處理它們以創建新的暗淡記錄並插入它。

這意味着如果單個提取包含更新的100個記錄(每個NK一個),它應該組裝100 +(100 * 9)個記錄來插入/更新暗淡表。這種方法有多好。

我試圖做的其他方法只是做一個查找到昏暗的表爲NK獲取最近的記錄(屬性沒有改變)的值,並插入它並更新當前的。

什麼是更好的方法在源端對一個屬性更改彙編記錄或查看dim表的最近記錄並處理它。

如果這沒有意義,想進一步闡述它。

感謝

這裏是表

alt text http://img96.imageshack.us/img96/1203/modelzp.jpg

+1

對不起,但我很努力去理解這裏發生了什麼。也許你可以再詳述一些。在我的書中,dimTable是一個維度表,它是EDW(企業數據倉庫)的一部分。也許你可以發佈某種模型,並用一個例子來解釋這個問題。 – 2010-06-11 12:37:05

+1

我同意,如果您可以通過樣本數據和輸出發佈相對簡單的源和目標表模式版本(實際上可能是維度人員期望的中間版本),我認爲我們可以更輕鬆地提供幫助。 – 2010-06-11 16:26:48

+0

對不起,當我說edw表,這意味着我的數據存儲在其上建立數據表。是的,我很快就會發布模型。謝謝 – Sreedhar 2010-06-12 02:04:59

回答

1

看一看this example的模型。

它應該是相對簡單的。

它根據您的規則來調整基礎數據。

它決定了非規範化的「行」

它創建了一個三角形的變化時間加入,以確定每個週期的開始和結束(什麼我打電話快照)

然後加入那些窗口到基礎數據以確定當時數據的狀態(此時實際完成的數據)

我認爲您可能需要查看窗口機制 - 它會返回正確的數據,但我不喜歡窗口重疊邏輯對我的看法 - 它不是很小 - 我很擔心邊界條件。

-- SO3014289 

CREATE TABLE #src (
    key1 varchar(4) NOT NULL 
    ,key2 varchar(3) NOT NULL 
    ,key3 varchar(3) NOT NULL 
    ,AttribCode int NOT NULL 
    ,AttribSubCode varchar(2) 
    ,Value varchar(10) NOT NULL 
    ,[Start] date NOT NULL 
    ,[End] date NOT NULL 
) 

INSERT INTO #src VALUES 
('9750', 'C04', '789', 1, NULL, 'AAA', '1/1/2000', '12/31/9999') 
,('9750', 'C04', '789', 2, NULL, 'BBB', '1/1/2000', '12/31/9999') 
,('9750', 'C04', '789', 3, 'V1', 'XXXX', '1/1/2000', '12/31/9999') 
,('9750', 'C04', '789', 3, 'V2', 'YYYY', '1/1/2000', '1/2/2000') 
,('9750', 'C04', '789', 3, 'V2', 'YYYYY', '1/2/2000', '12/31/9999') 

;WITH basedata AS (
    SELECT key1 + '-' + key2 + '-' + key3 AS NK 
    ,CASE WHEN AttribCode = 1 THEN Value ELSE NULL END AS COL1 
    ,CASE WHEN AttribCode = 2 THEN Value ELSE NULL END AS COL2 
    ,CASE WHEN AttribCode = 3 AND AttribSubCode = 'V1' THEN Value ELSE NULL END AS COL3 
    ,CASE WHEN AttribCode = 3 AND AttribSubCode = 'V2' THEN Value ELSE NULL END AS COL4 
    ,[Start] 
    ,[End] 
    FROM #src 
) 
,ChangeTimes AS (
    SELECT NK, [Start] AS Dt 
    FROM basedata 
    UNION 
    SELECT NK, [End] AS Dt 
    FROM basedata 
) 
,Snapshots as (
    SELECT s.NK, s.Dt AS [Start], MIN(e.Dt) AS [End] 
    FROM ChangeTimes AS s 
    INNER JOIN ChangeTimes AS e 
     ON e.NK = s.NK 
     AND e.Dt > s.Dt 
    GROUP BY s.NK, s.Dt 
) 
SELECT Snapshots.NK 
    ,MAX(COL1) AS COL1 
    ,MAX(COL2) AS COL2 
    ,MAX(COL3) AS COL3 
    ,MAX(COL4) AS COL4 
    ,Snapshots.[Start] 
    ,Snapshots.[End] 
FROM Snapshots 
INNER JOIN basedata 
    ON basedata.NK = Snapshots.NK 
    AND NOT (basedata.[End] <= Snapshots.[Start] OR basedata.[Start] >= Snapshots.[End]) 
GROUP BY Snapshots.NK 
    ,Snapshots.[Start] 
    ,Snapshots.[End]