Sql server SQL Server-缓慢更改维度联接

Sql server SQL Server-缓慢更改维度联接,sql-server,scd,Sql Server,Scd,我有一个事实表和员工层表 所以事实表看起来有点像 employee_id call date Mark 1 1-1-2017 Mark 2 1-2-2017 John 3 1-2-2017 然后需要有一个“层级别”的数据结构——一个缓慢变化的维度表。我想保持这个简单-我可以将这个表的结构更改为任何形式,但现在我已经创建了它 employee_id tier1_start ... ti

我有一个事实表和员工层表

所以事实表看起来有点像

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月份的1级指标,或2月份的2级指标。显然,必须将历史上不断变化的层维度联系起来

现在我能想到的最笨拙的方法。。。只是使用employee_id将事实表连接到层表上

然后,做一个更笨拙的案例陈述:

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
是的,正如你所看到的,这是非常笨拙的。
我在想,也许我需要改变一下这个表的结构。

您最好将层表一分为二

因此,有一个这样的分层表:

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表并在要查找的TierID上进行筛选


这也使您能够多次升级/降级。您只需按员工筛选并按日期排序即可找到当前层。

是否会有超过3层?您已经描述了一个类型3 SCD,您可能会更好地使用类型2 SCD,其中添加了一行,而不是一列。这允许捕获任何更改的属性。这并不能回答实际简化、一致的查询将事实数据与维度数据连接起来的问题。例如,10月3日或任何时候打电话。这属于哪一层?类型3无效,它实际上会破坏历史生效日期。这是许多SCD讨论的问题。每个人都在谈论如何形成维度表——实际上没有人谈论真正起作用的查询!我真正拥有的是2型SCD表。最有效的写信方式。我需要把它转换成6型。事实表联接最有效。您的维度不会在每次状态更改时添加行,因此它不是类型2。Dw通过使ETL复杂化来简化查询。看起来你已经知道这一切了。我真的不确定这里的问题是什么。一个实际的简化、连贯的查询就是加入你的代理键,你的答案从另一边出来。SCD2唯一没有涉及的是当员工改变状态,但在此期间没有活动加入维度并使其出现。这很好,但没有回答“简化”查询的基本问题。如何将事实表联接到employeetier表?现在,请忘记标注表及其描述。您将如何执行联接?您不能简单地使用事实日期>tierdate,因为您将获得多个结果!您想对查询执行什么操作?类似于获取特定时间段内每层的调用数?@user45867-您可以通过加入子查询、排序和限制结果来解决此问题。如果按TierDate DESC对结果进行排序,并将结果限制为1,则可以轻松地连接到任意日期的最新行。