数据仓库 - 数据版本控制



我目前正在为一家金融公司设计一个数据仓库。虽然大量的流程是相当标准的,但我遇到了一个数据事件的问题(我相信只存在于金融领域(,这些问题会影响许多行及其随时可能发生的历史记录。

为了更好地解释这个问题。假设我们有一个账户 A,并且发生了其他 2 个月 4 笔影响其余额的交易,将其从 10000 更改为 20000。 当我运行该月的报告时,它将显示派生该值的活动。 现在它变得困难了,在我回溯一个影响平衡的交易一个月后,将其从 20000 更改为 15000。

运行报告 在那之前,回溯日期应该告诉我原来的 20000,但在回溯交易之后应该告诉我 15,000。

为了更好地说明,请参阅下面的数据。


9 月和 10 月的交易

10 月 28 日追溯交易,9 月 13 日 500 美元

以及 11 月 8 日为 9 月 17 日的追溯交易,以贷记 -50 美元

╔═════════════════╦═════════════════════════╦════════╦══════════════════╦═══════════════╦═════════════╦═════════╗
║ Key_Transaction ║ SK_TransactionEffective ║ Amount ║ PrincipleBalance ║ SK_ReportDate ║ SK_AsOfDate ║ Version ║
╠═════════════════╬═════════════════════════╬════════╬══════════════════╬═══════════════╬═════════════╬═════════╣
║               1 ║ 12/09/2018              ║  -1000 ║            20000 ║ 12/09/2018    ║ NULL        ║ 1       ║
║               6 ║ 13/09/2018              ║   -500 ║            19500 ║ 13/09/2018    ║ 28/10/2018  ║ 2       ║
║               2 ║ 16/09/2018              ║    -50 ║            19950 ║ 16/09/2018    ║ NULL        ║ 1       ║
║               7 ║ 16/09/2018              ║    -50 ║            19450 ║ 16/09/2018    ║ 28/10/2018  ║ 2       ║
║              12 ║ 16/09/2018              ║     50 ║            19950 ║ 16/09/2018    ║ 8/11/2018   ║ 3       ║
║               3 ║ 1/10/2018               ║    250 ║            20200 ║ 30/09/2018    ║ NULL        ║ 1       ║
║               8 ║ 1/10/2018               ║    250 ║            19700 ║ 30/09/2018    ║ 28/10/2018  ║ 2       ║
║              13 ║ 1/10/2018               ║    250 ║            20200 ║ 30/09/2018    ║ 8/11/2018   ║ 3       ║
║               4 ║ 6/10/2018               ║  -1200 ║            19000 ║ 6/10/2018     ║ NULL        ║ 1       ║
║               9 ║ 6/10/2018               ║  -1200 ║            17800 ║ 6/10/2018     ║ 28/10/2018  ║ 2       ║
║              14 ║ 6/10/2018               ║  -1200 ║            19000 ║ 6/10/2018     ║ 8/11/2018   ║ 3       ║
║               5 ║ 22/10/2018              ║    100 ║            19100 ║ 22/10/2018    ║ NULL        ║ 1       ║
║              10 ║ 22/10/2018              ║    100 ║            17900 ║ 22/10/2018    ║ 28/10/2018  ║ 2       ║
║              15 ║ 22/10/2018              ║    100 ║            19100 ║ 22/10/2018    ║ 8/11/2018   ║ 3       ║
║              11 ║ 29/10/2018              ║  -1000 ║            16900 ║ 29/10/2018    ║ NULL        ║ (New)1  ║
║              16 ║ 29/10/2018              ║  -1000 ║            18100 ║ 29/10/2018    ║ 8/11/2018   ║ (New)2  ║
╚═════════════════╩═════════════════════════╩════════╩══════════════════╩═══════════════╩═════════════╩═════════╝

现在,当我运行 9 月份的报告(2018-09-01 至 2018-09-30(时,我应该是 V1 或当SK_AsOfDate为 NULL 时

如果我运行 10 月份的报告(2018-10-01 至 2018-10-31(,我的最新记录应该是 (11(,本金余额为 16900

而我目前的本金余额(截至2018-11-09(应计算为(16(的余额,PB为(18100(

我已经添加了尝试处理版本控制问题的SK_AsOfDate,但我仍然在努力寻找一种简单而优雅的方式来实现这一目标"截至 2018 年 9 月 30 日,我的余额是多少,将忽略 V2 和 V3 更改。

我想把这件事做好,幸运的是,我走得不太远,所以欢迎提出建议!我很乐意添加尽可能多的字段,使此过程易于从另一端报告。

在财务(和其他一些(交易数据中,你基本上有两个时间维度

交易日期- 代表交易发生的实时时间,但由于技术原因,您可能会稍后收到交易。

预订日期- 这是交易进入您的预订系统的时间戳。有时称为输入日期

关于交易日期,交易可能发生为延迟到达,相反的预订日期根据定义始终是最新的。

两个时间维度允许两种不同类型的报表

预订日期报告通常用于预订目的(因为它在历史记录中永远不会更改(。交易日期报表在时间上更真实,但在上个月的两天内运行它可能会产生两个不同的结果(由于交易在第二天延迟到达(。

看起来这是迟到的事实的一些问题。 问题是您稍后要报告的内容。您想以某种方式报告新值还是只是忽略新到来的事实。

第一步是确定能够通知差异的业务密钥。 金额或本金余额Key_Transaction是否随时间变化,或者只是新记录的到来?尝试创建表的快照以找到值在时间上的差异,以创建良好的业务。

可以在这里找到一些好主意:http://www.disoln.org/2013/12/Design-Approach-to-Handle-Late-Arriving-Dimensions-and-Late-Arriving-Facts.html

什么是源数据库?在 Sql Server 中,您可以尝试使用变更数据捕获(必须在服务器上启用(或在 ETL 中创建上述机制。

我猜你提到的表不是低级颗粒,而是某种基于其他表的聚合。尝试询问技术上落后于什么,并深入挖掘以找到它的工作原理。

我认为您的情况可以通过"快照"表来解决。在金融世界中,截至 2018-10-31 或截至 2018-11-09 的详细说明很重要,您需要为每个"截至"保留一份数据副本,每个组织看起来都可能不同,就像您的每周一样。频率由您决定。当您拥有这组数据时,无论最终状态如何,您都可以返回并获得准确的报告。

创建这些"快照"表的方法基本上是在每个"截至"日期创建一个带有"快照日期"的事实数据表副本,这个快照日期又名"截至"可以在您的报告中用于查看您需要查看的数据版本。

让我知道这是否解决了您的问题。

最新更新