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

Posted

技术标签:

【中文标题】根据可变日期查询数据仓库【英文标题】:Querying a data warehouse based on a varible date 【发布时间】:2019-02-04 17:41:30 【问题描述】:

我有一个维度表,用于跟踪对类似于员工对象的对象所做的更改。然而,员工有一个“状态”(待定、活动、非活动等)以及在源数据库的另一个表中跟踪的每个状态的开始和结束日期。

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

如果我希望创建报表,例如在特定日期具有给定状态的员工,我该如何建模。如果我使用状态更改作为事实,我将只获得员工关于状态更改日期的其他信息。

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

或者我可以像维度表一样创建一个具有有效起始日期和截止日期的事实表吗?

或者我是否在这方面做得很差,应该以不同的方式处理它?

【问题讨论】:

您需要来自源系统的 事件提要,使用 employee_id, timestamp, old_status, new_status。您可以使用 employee_id, validfrom, validto, status 构建 SDC 2 表。 这几乎就是我用于状态维度的模型,我的问题是结合两个维度。如果有相关事实(例如已付款),我知道该怎么做,但是当事实只是一个日期时,我不确定该怎么做。 更多细节贴出来,希望更清楚;) 如果我想生成一份报告,列出 2019 年 1 月 1 日的所有在职员工,我是否需要在事实表中为每个员工和每个日期的状态添加一行?这似乎很麻烦,因为您需要为每个员工每天记录。我需要事实表吗?我可以直接针对维度进行报告吗?从我所读到的,这似乎是气馁?编辑:抱歉,提交了原始评论,然后由于 5 分钟规则无法编辑,没有看到您的更新 【参考方案1】:

您必须决定的第一件事是您是投票员工还是获得员工状态变化的事件源

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

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

表格如下

 employee_id, 
 validfrom_date, 
 validto_date, 
 status

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

第二个选项涉及更多,但产生更准确的结果。

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

可能的接口是:

 employee_id, change_timestamp, old_status, new_status

注意old_status是多余的,这个值可以用来检查接口是否一致。

决赛桌和上一张类似,只是用timestamps代替dates。

 employee_id, 
 validfrom_timestamp, 
 validto_timestamp, 
 status

validfrom_timestamp 再次是来自接口的事件的时间戳,validto_timestamp 被计算出来。

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

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

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

选择Employee 表。如果您报告员工状态,则角色是事实表。如果您使用它来加入其他事实表,则角色是 dimension

【讨论】:

哦,好的,那么使用validfrom_date和validto_date之间的date_param查询两个表是否有效?我读过我应该只查询索引的单个日期列。 如果您设法保持validfromvalidto 列的一致性,您可能会从高性能查询中获益。请提供指向您的来源的链接以便能够讨论它。

以上是关于根据可变日期查询数据仓库的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库中的时间维度

MsSQL如何在一次查询中从给定的日期和仓库号获取最近的未来值和值的总和

关于数据仓库中复杂报表SQL语句的写法

利用双表技术解决多列日期查询性能问题

数据仓库-订单管理应该注意那些事项?

重磅 | 更简单易用的数据仓库,阿里云推出分析型数据库3.0版