我正在使用PostgreSQL,并有一个表用于结算周期,另一个用于在结算周期中进行的付款。
我试图找出如何根据每个结算周期的最后一个付款日期后剩余的金额来计算利息。问题是,每次还款时,都必须根据之后剩余的金额计算利息。
我对构建此查询的想法是这样的。构建从结算周期的上一个支付日期到今天的所有日期的数据。使用分区,获取第一个日期的剩余金额。对于第二个日期,使用上一行的金额并添加其兴趣,然后计算对此的兴趣。
不幸的是,我只是陷入困境,无法弄清楚如何将其变成查询!
这里有一些示例数据,使事情更容易理解。
结算周期:
id | ends_at
-----+---------------------
1 | 2017-11-30
2 | 2017-11-30
支付方式:
amount | billing_cycle_id | type | created_at
-----------+------------------+---------+----------------------------
6000.0000 | 1 | payment | 2017-11-15 18:40:22.151713
2000.0000 | 1 |repayment| 2017-11-19 11:45:15.6167
2000.0000 | 1 |repayment| 2017-12-02 11:46:40.757897
因此,如果我们看到,用户在19日还款,因此利息截止日期(2017年11月30日)的应付金额仅为4000.因此,从30日到2日,利息将每天计算在4000上。但是,从第二,利息只需要在2000年计算。
利息计算(今天是2017-12-04):
date | amount | interest
------------+---------+----------
2017-12-01 | 4000 | 100 // First day of pending dues.
2017-12-02 | 2100 | 52.5 // Second day of pending dues.
2017-12-03 | 2152.5 | 53.8125 // Third day of pending dues.
2017-12-04 |2206.3125| // Fourth's day interest will be added tomorrow
您的数据太稀疏了。需要编写此查询没有任何意义,因为随着时间的推移,查询将变得更加复杂。当利率随时间变化时会发生什么?
表本身(或辅助表,取决于您希望如何构建它)可以具有您每次存款/取款时添加的运行余额。 (我建议这个表是加法的)否则你的计算和会计都比你应该的要困难得多。即使你在这里提出问题的方式,也没有足够的信息来进行计算。 (缺少利率)在这种情况下,您的存储过程将变得太复杂。复杂意味着错误,当你谈论他们的钱时,人们会对错误感到烦恼。