我每天在 DimPerson 维度表中跟踪员工变化,并在每个月末填写我的事实表并计算雇用、离职和人数。 对于这个例子,假设我将在 4 月 30 日月底填充事实表。现在这是我面临的问题: 我在 4 月 17 日有一个“雇用”操作的员工记录,所以在那个时间点我的 DimPerson 表如下所示:
+-------+-----------+----------+--------+--------------------+-------+
| EmpNo | Firstname | LastName | Action | EffectiveStartDate | isCur |
+-------+-----------+----------+--------+--------------------+-------+
| 4590 | John | Smith | Hire | 4/17/2017 | Y |
+-------+-----------+----------+--------+--------------------+-------+
现在 2 天后,我看到同一名员工,但执行的是“更换经理”操作,所以现在我的 DimPerson 表变成了这样:
+-------+-----------+----------+-----------------+--------------------+-------+
| EmpNo | Firstname | LastName | Action | EffectiveStartDate | isCur |
+-------+-----------+----------+-----------------+--------------------+-------+
| 4590 | John | Smith | Hire | 4/17/2017 | N |
| 4590 | John | Smith | Manager Change | 4/19/2017 | Y |
+-------+-----------+----------+-----------------+--------------------+-------+
因此,在月末,当我选择所有“当前”员工时,我将错过此人的雇用捕获,因为他最近的记录只是经理变动,而实际招聘发生在“月内”。 在进行定期快照时,您可能会错过某些更改,这是否正常?在这种情况下,您建议我做什么来捕获 Hire 操作?
最佳答案
听起来您需要以不同的方式填写您的事实表 - 您需要一个可靠的招聘、离职和员 worker 数来源。如果可用,您可以直接从源系统中获取这些事件,或者从您的维度表中获取它们(如果它保证包含所有历史记录,而不仅仅是一天结束时的更改)。
源系统是最好的解决方案,但是如果维表整体显示你需要的历史,那么与其选择isCur人并查看他们最近的 Action ,你需要获取该时期的所有维表记录您正在快照,并计算每种类型的操作。
但是,我根本不建议您使用维度表来捕获交易历史记录。维度上的 SCD 应该用于跟踪维度属性本身的变化,而不是跟踪对人的操作历史。理想情况下,您将创建一个事务事实表来记录这些操作。这样,您就有了一个记录所有操作的事务性事实,并且您可以使用该事实表在每个月底填充您的定期快照,而您的维度表无需担心它。将您的维度表视为人的记录,而不是对人的行为的记录。
关于mysql - 定期快照事实表 - 可能缺少一些捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43675176/