2

我正在创建一个包含债券和贷款等金融证券数据的 DW。这些证券与付款时间表相关联。例如,债券可以按季度支付,而抵押贷款通常按月支付(有时每两周支付一次)。付款时间表是在交易证券时创建的,并且在大多数情况下将保持不变。但是,设计需要适应那些确实发生变化的情况。

我目前正在尝试对这些数据进行建模,但很难提出可行的设计。最常查询的字段之一是“下一个付款日期”。用户通常想知道证券下次何时付款。因此,我想让他们尽可能轻松地获得每种证券的下一个付款日期和金额。

此外,用户经常运行历史查询,在这种情况下,他们希望下一个付款日期和金额为特定时间点。例如,他们可能希望回顾 1/31/09 并查询下一个付款日期(对于抵押贷款,通常是 2009 年 2 月)。他们想要查询证券的整个付款时间表也很常见,该时间表可能包含 360 条记录(30 年抵押贷款 x 12 次付款/年)。

由于下一个付款日期和金额将每月甚至每两周更改一次,因此这些字段似乎不太适合缓慢变化的维度。使用事实表可能更有意义,但我不确定如何对其建模。任何想法将不胜感激。

4

3 回答 3

1

下一个付款日期是“无事实事实表”的示例。没有衡量标准,至少有两个维度之间的 FK:安全性和时间。

您可以对证券进行非规范化以拥有一个类型 1 SCD(每次加载都会覆盖),其中包含一些重要的“下一个付款日期”。

但是,我认为最好将一些重要的付款日期与事实一起提供。如果您有一个贷款的“当前余额”事实表,那么您有一个适用于该余额的日期,您也可以将上一个和下一个付款日期与余额一起携带。

对于整个付款计划,您有一个特殊的无事实事实表,其中仅包含适用日期和未来付款日期的顺序。这样,当时间表发生变化时,您可以选择某个特定日期的付款顺序。

于 2009-07-08T17:05:24.773 回答
1

我会使用一个表(securityid、startdate、paymentevery、period),它还可以包括 enddate、paymentpershare

period 为 1 天,2 周,3 月,4 年。

因此,对于从 2009 年 3 月 1 日开始每周付款的安全 1,日期在 4 月 2 日改为每 20 天一次,然后在 2009 年 5 月 1 日之后每周一次,然后在 2009 年 7 月 1 日改为每月一次,它将包含:

1,'3/1/2009',1,2
1,'4/2/2009',20,1
1,'5/1/2009',1,2
1,'7/1/2009',1,3

要获得实际日期,我会使用这样的算法:

要了解从 2009 年 3 月 5 日到 2008 年 5 月 17 日的证券 1 的付款日期:

Find first entry before 3/5 = 3/1
Loop:
 Get next date that's after 3/5 and before the next entry (4/2 - weekly) = 3/8
 Get next date that's before next the entry (4/2) = 3/15
 Get next date that's before next the entry (4/2) = 3/22
 Get next date that's before next the entry (4/2) = 3/29
Next date >4/2 switch to next entry:
Loop:
 Get next date that's after 4/2 and before the next entry (5/1 - every 20 days) = 4/22
Next date 5/12 is AFTER next entry 5/1, switch to next entry
Loop:
 Get next date that's after 5/1 and before the lastdate (5/17 - weekly) = 5/8
 Get next date that's before the lastdate = 5/15
Next date > 5/17

2009 年 3 月 5 日和 2008 年 5 月 17 日之间的日期为 3/8,3/15,3/22,3/29,4/22,5/8,5/15

于 2009-07-18T20:55:21.300 回答
0

为什么不将下一个付款日期存储为从当前付款日期算起的天数?

进一步澄清:

对于与某个日期维度相关的每笔过去付款,都会有一个事实。这些事实中的每一个都有next payment in一个整数字段。这个想法是当前付款next payment in的日期+将是下一个付款事实的日期。这应该可以满足一切。

于 2009-07-08T16:40:32.670 回答