我有一个事实表和员工“层”表,比方说。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
是的,正如你可以看到这是很笨拙。 我在想也许我需要改变这一点的结构。
是否会有超过3层?您已经描述了3型SCD,您可能更适合2型SCD(添加了行而非列)https://en.wikipedia.org/wiki/Slowly_changing_dimension。这允许捕获任何更改的属性 –
不回答将实际数据与维度数据实际结合在一起的实际简化且一致的查询的问题。例如,一个电话是在10月3日或任何时候发出的。这个属于什么层次?类型3无效,它实际上破坏了历史有效日期。这是很多SCD讨论的问题。每个人都在谈论如何构建维度表 - 没有人会谈论真正解除查询的问题!我真正拥有的是2型SCD表。写入最有效。我需要将其转换为类型6.对于事实表连接最有效。 – user45867
您的维度不会为每个状态更改添加行,因此它不是类型2.Dw通过使ETL变得复杂来简化查询。看起来你已经知道了这一切。我不确定这里的问题是什么。 –