根据可变日期查询数据仓库

Querying a data warehouse based on a varible date

我有一个维度 table 跟踪对类似于员工对象的对象的更改。但是,该员工有一个 "status"(待处理、活动、不活动等)以及每个状态的开始和结束日期,这些状态在源数据库的另一个 table 中进行跟踪。

状态更新次数没有限制。它可以在状态之间来回切换。

如果我想创建一个报告,例如在特定日期具有给定状态的员工,我该如何建模。如果我使用状态更改作为事实,我只会从员工那里获得状态更改日期的附加信息。

我是否需要创建一个每天根据当前员工记录和状态更新的事实 table?

或者我可以创建一个事实 table,其生效日期类似于维度 table 中的生效日期吗?

或者我在这方面偏离了方向并且应该以不同的方式处理它?

您必须决定的第一件事是,您是 对员工进行投票 还是获得 事件提要 ]员工状态变化.

第一个选项导致简化设计,您定期(比如每天一次)加载所有员工的员工状态并构建您的维度。

请注意,这是一个近似值,因为员工一天可以多次切换状态,但您每天只考虑一个状态。

table如下

 employee_id, 
 validfrom_date, 
 validto_date, 
 status

validfrom_date是提取日期,validto_date是计算出来的。您丢弃所有状态没有变化的员工。

第二个选项更复杂,但产生的结果更准确。

您从源系统加载所有员工的所有状态更改,并带有准确的时间戳,因此每天可以涵盖更多更改。

可能的界面是:

 employee_id, change_timestamp, old_status, new_status

请注意,old_status是多余的,该值可用于检查接口是否一致。

最后的table和前面的类似,只是用了timestamp,而不是date

 employee_id, 
 validfrom_timestamp, 
 validto_timestamp, 
 status

同样,validfrom_timestamp 是来自接口事件的时​​间戳,validto_timestamp 是计算出来的。

在此设置中,建议定期检查维度的一致性

问题 - 如果某些更改事件丢失,您将永远无法恢复它。随着时间的推移,您可能会累积此类错误。所以说每月检查一次维度的实际状态是否与源系统中的状态相匹配。如果不是你解决差异。

最后不要猜测这是事实还是维度table。在Kimball的模型中,它们之间没有严格的区别。

拍一张 Employee table。如果您报告员工状态,则角色是 事实 table。如果你用它来加入其他事实 tables 角色是 dimension.