2017-03-17 49 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