2017-03-17 92 views
0

我有一個事實表和員工「層」表,比方說。SQL Server - 緩慢更改維度加入

所以事實表看起來像八九不離十

employee_id call date 
Mark   1  1-1-2017 
Mark   2  1-2-2017 
John   3  1-2-2017 

再就是需要爲「層級」的數據結構 - 一個緩慢變化的維度表。我想保持這種簡單 - 我可以將此表的結構更改爲任何內容,但現在我已經創建了它。

employee_id tier1_start ... tier2_start ... tier3_start 
Mark   5-1-2016 
John   6-1-2016   8-1-2016 
Lucy   6-1-2016      10-1-2016 

兩個重要注意事項。這種表格的運作假定促銷活動只會發生一次 - 也就是說不會發生降級和再促銷。另外,有可能可以從第1層跳到第3層。

我試圖想出一個可能的最佳查詢來爲事實表提供'層'維(非規範化)。

例如,我想查看2月份的Tier 1指標或2月份的Tier 2指標。顯然,歷史性變化的層級維度必須聯繫起來。

我現在可以想到的最笨的方法就是使用employee_id在層表上簡單地加入事實表。

然後,做一個甚至笨拙case語句:

case 
when isnull(tier3_start,'0') < date then 'T3' 
when isnull(tier2_start, '0') < date then 'T2' 
when isnull(tier1_start, '0') < date then 'T1' 
else 'other' 
end as tier_level 

是的,正如你可以看到這是很笨拙。 我在想也許我需要改變這一點的結構。

+0

是否會有超過3層?您已經描述了3型SCD,您可能更適合2型SCD(添加了行而非列)https://en.wikipedia.org/wiki/Slowly_changing_dimension。這允許捕獲任何更改的屬性 –

+0

不回答將實際數據與維度數據實際結合在一起的實際簡化且一致的查詢的問題。例如,一個電話是在10月3日或任何時候發出的。這個屬於什麼層次?類型3無效,它實際上破壞了歷史有效日期。這是很多SCD討論的問題。每個人都在談論如何構建維度表 - 沒有人會談論真正解除查詢的問題!我真正擁有的是2型SCD表。寫入最有效。我需要將其轉換爲類型6.對於事實表連接最有效。 – user45867

+0

您的維度不會爲每個狀態更改添加行,因此它不是類型2.Dw通過使ETL變得複雜來簡化查詢。看起來你已經知道了這一切。我不確定這裏的問題是什麼。 –

回答

0

你可能會更好地將你的層表分成兩部分。

所以有一個一級表是這樣的:

TierID Tier 
------------------ 
1   Tier 1 
2   Tier 2 
3   Tier 3 

而一個EmployeeTier表:

ID EmpID TierID TierDate 
--------------------------------------- 
1  1  1   Jun 1, 2016 
2  1  3   Oct 2, 2016 
3  2  1   Jul 10, 2016 
4  2  2   Nov 11, 2016 

現在,您可以查詢EmployeeTier表和過濾你正在尋找的層級ID。

這也給你提升/降級多次的能力。您只需由員工過濾並按日期排序即可找到當前層。

+0

這很好 - 但並沒有回答'簡化'查詢的根本問題。我如何將一張事實數據表加入您的employeetier表中? (忘記維度表與現在的描述)。你將如何執行連接?你不能簡單地有事實日期> tierdate,因爲你會得到多個結果! – user45867

+0

你想對查詢做什麼?就像在特定的時間段內獲得每層的呼叫數量一樣? – PhillipXT