看一看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]
對不起,但我很努力去理解這裏發生了什麼。也許你可以再詳述一些。在我的書中,dimTable是一個維度表,它是EDW(企業數據倉庫)的一部分。也許你可以發佈某種模型,並用一個例子來解釋這個問題。 – 2010-06-11 12:37:05
我同意,如果您可以通過樣本數據和輸出發佈相對簡單的源和目標表模式版本(實際上可能是維度人員期望的中間版本),我認爲我們可以更輕鬆地提供幫助。 – 2010-06-11 16:26:48
對不起,當我說edw表,這意味着我的數據存儲在其上建立數據表。是的,我很快就會發布模型。謝謝 – Sreedhar 2010-06-12 02:04:59