使用版本ID缓慢更改维度类型2

时间:2016-01-11 22:05:23

标签: sql sql-server data-warehouse

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

我第一次想到有关历史表的基线信息。这里有一些信息

**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名称,我的帐户表上会有一条新记录:

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表开始精确检索我的员工报告,这些表钻取其余表格?通过Versionid是不可能的,因为versionId是独立的,并且对于每个表来说都是不同的,因为我觉得它会很慢,如果我在同一天有很多变化,我应该用最新的versionid添加条件。

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

2 个答案:

答案 0 :(得分:1)

在适当的维度模型中,您的维度行应由代理键标识。您正在混淆维度键,业务键和版本的概念,这就是您在建模时遇到问题的原因。

正如其他人所说,你也错过了一个事实表。您可能会遇到一种被称为“无事实的事实”的情况,即事实表仅用于建立维度之间的关系,并且没有记录该事实的度量。

我认为你的模型应该是这样的:

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是业务键。我的业务密钥永远不会改变,但每次关于我(即名称)的某些内容发生变化时,我都会有不同的代理值。我只使用这个命名约定来说明模型,我不会在实践中推荐它。

答案 1 :(得分:0)

以下查询将为您提供按任意特定日期的数字升序和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)的最新记录。组织的子查询对组织也是如此。

希望这会有所帮助..