繁体   English   中英

缓慢更改带有版本ID的Type 2尺寸

[英]Slowly changing dimension Type 2 with Version ID

我正在尝试使用不同的表来实现此功能,以便最终能够获得历史报告。

第一次,我想在历史记录表上有一个基线信息。 这里一些信息

**EmployeeHistory:**

id  Number  OrgId   AccountId   VersionId   Date
1   34343   1       1           1           2010-01-01


**OrganizationHistory:**

OrgId   Name    VersionId   Date
1       Sales   1           2010-01-01


**AccountHistory:**

AccountId   Name    VersionId   Date
1           ABC     1           2010-01-01


**Final Employee Report:**

id  Number  OrgId   AccountId   Date
1   34343   Sales   ABC         2010-01-01

我正在使用VersionId(在这种情况下等于1)将帮助我在特定时间检索数据。 任何更改都将记录在表上的记录上,并将VersionId增加1,所以让我们说现在我更改了AccountId名称,我的Account表上将有一个新记录:

AccountId   Name    VersionId    Date
1           ABC     1            2010-01-01
1           ABB     2            2010-01-02

好了,现在我要更改员工编号

id  Number  OrgId   AccountId   VersionId   Date
1   34343   1       1           1           2010-01-01
1   34355   1       1           2           2010-01-03

对于每个单独的表都很好,我可以轻松地按Date和VersionId检索数据顺序,因为我可以在同一天进行很多更改。

我的问题是如何从EmployeeHistory表开始细化其余表,以准确地检索Employee报告? 由于版本ID是独立的,并且对于每个表都是不同的,因此无法通过Versionid进行更改,或者由于日期的原因,或者是因为我猜会很慢,并且如果我在同一天进行了很多更改,则可能应该在条件上加上最新的versionid。

有什么想法或好的例子来解决这个问题吗?

在适当的尺寸模型中,尺寸行应使用代理键来标识。 您正在混淆维度键,业务键和版本的概念,这就是为什么建模存在问题。

正如其他人所指出的,您还缺少一个事实表。 您可能会遇到一种称为“无事实的事实”的情况,在该情况下,事实表仅用于建立维之间的关系,而没有记录该事实的度量。

我认为您的模型应如下所示:

employment_factless_fact (dim_emp_id, dim_org_id, dim_acc_id)

dim_employee (dim_emp_id,emp_id,...)

dim_organisation (dim_ord_id,org_id,org_name,from_date,to_date,...)

dim_account (dim_acc_id,acc_id,acc_name,from_date,to_date,...)

dim_x_id和x_id之间的区别在于dim_x_id是代理密钥,而x_id是业务密钥。 我的业务密钥永远不会改变,但是每次我的某些事情(即名字)改变时,我都会具有不同的代理值。 我仅使用此命名约定来说明模型,在实践中不推荐使用。

以下查询将为您提供在任何特定日期按Number的升序和VersionId的降序排序的员工变更

SELECT EH.*
  FROM EmployeeHistory EH
 INNER 
  JOIN (
         SELECT OH.OrgId
              , OH.Date
              , MAX(OH.VersionId) AS VersionId
           FROM OrganizationHistory OH
          GROUP
             BY OH.OrgId, OH.Date
       ) O
    ON EH.OrgId = O.OrgId
   AND EH.Date = O.Date
 INNER
  JOIN (
         SELECT AH.AccountId
              , AH.Date
              , MAX(AH.VersionId) AS VersionId 
           FROM AccountHistory AH 
          GROUP 
             BY AH.AccountId
              , AH.Date
       ) A
    ON EH.AccountId = A.AccountId
   AND EH.Date = A.Date
 WHERE EH.Date = "2010-01-01"
 ORDER
    BY EH.Number ASC
      ,EH.VersionID DESC

帐户的子查询根据所有日期的VersionId获取帐户的最新记录(AccountId)。 组织的子查询对组织的作用相同。

希望这可以帮助..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM