我正在尝试使用不同的表来实现此功能,以便能够在最后生成历史报告。
我第一次想到有关历史表的基线信息。这里有一些信息
**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添加条件。
有任何想法或好的例子来解决这个问题吗?
答案 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)的最新记录。组织的子查询对组织也是如此。
希望这会有所帮助..