我每天在一个DimPerson维度表中跟踪员工的变化,在每个月底填充我的事实表,并计算雇用、离职和人数。在本例中,假设我将填充月末4月30日的事实表。现在我面临的问题是:我在4月17日有一个员工记录,这是一个“雇用”操作,所以在那个时间点,我的DimPerson表是这样的:
+-------+-----------+----------+--------+--------------------+-------+
| EmpNo | Firstname | LastName | Action | EffectiveStartDate | isCur |
+-------+-----------+----------+--------+--------------------+-------+
| 4590 | John | Smith | Hire | 4/17/2017 | Y |
+-------+-----------+----------+--------+--------------------+-------+两天后,我看到了同一个员工,但执行了“经理更改”操作,所以现在我的DimPerson表变成了这样:
+-------+-----------+----------+-----------------+--------------------+-------+
| EmpNo | Firstname | LastName | Action | EffectiveStartDate | isCur |
+-------+-----------+----------+-----------------+--------------------+-------+
| 4590 | John | Smith | Hire | 4/17/2017 | N |
| 4590 | John | Smith | Manager Change | 4/19/2017 | Y |
+-------+-----------+----------+-----------------+--------------------+-------+因此,在月底,当我选择所有“当前”员工时,我将错过此人的招聘捕获,因为他的最新记录只是经理变更,而实际招聘发生在“月内”。在进行定期快照时,您可能会错过某些更改,这正常吗?在这种情况下,您建议我做些什么来捕获雇用操作?
发布于 2017-04-28 16:30:43
听起来你需要以不同的方式填写你的事实表--你需要一个可靠的招聘人数、离职人数和人数来源。如果源系统可用,您可以直接从源系统中获取这些事件,或者从维度表中获取它们(如果维度表保证包含所有历史记录,而不只是一天结束时的更改)。
源系统将是最好的解决方案,但是如果维度表总体上显示了您需要的历史记录,那么您需要获取快照期间的所有维度表记录,并计算每种类型的操作,而不是选择isCur人员并查看他们最近的操作。
但是,我建议您根本不要使用维度表来捕获事务历史。维度上的SCD应用于跟踪维度属性本身的更改,而不是跟踪人员的操作历史记录。理想情况下,您应该创建一个事务性事实表来记录这些操作。这样,您就有了一个记录所有操作的事务事实,您可以使用该事实表在每个月底填充您的定期快照,而您的维度表不需要担心它。将维度表视为person的记录,而不是对person的操作。
发布于 2017-05-02 02:29:09
如果你的事实是为了显示月底的组织变化,我会说它正在按设计工作。该员工在月底有经理,但在上个月底不存在。这意味着该员工是在该月内被雇用的。对于每月的谷粒,不应该期望它显示每天的活动。
我们的employee维度包含雇用日期作为Type1属性。我们还在某些事实表中包括雇用日期,以允许与日期维度的角色扮演关系。
https://stackoverflow.com/questions/43675176
复制相似问题