运行 总计 - 日期差异

Running Total - Date difference

这是 table 的样子:

create table IncomeTest (SubjectId int, Date_Value date, debit number, credit number);

insert into IncomeTest values (1, '7-SEP-2017', 11000, 0);
insert into IncomeTest values (1, '7-DEC-2017', 6000, 0);
insert into IncomeTest values (1, '9-JAN-2018', 0, 16110);
insert into IncomeTest values (1, '9-JUL-2018', 0, 619.6);
insert into IncomeTest values (1, '23-JUL-2018', 0, 270.4);

commit;

借方表示提现,贷方表示提现。插入table后得到数据:

SubjectID | Date_value | Debit |  Credit 
    1       9/7/2017     11000         0
    1       12/7/2017     6000         0
    1       1/9/2018         0   16110.0
    1       7/9/2018         0     619.6
    1       7/23/2018        0     270.4

我这里的问题是我必须计算用户何时还清了他的贷款以及有多少he/she 延迟付款,这意味着第一笔借记 11000 已于 1/9/ 全额支付2018 年:我在这里计算这两个日期之间的日期差异,这就是延迟付款的金额,但随后我需要从 2018 年 1 月 9 日的贷方中扣除 11000 并继续进行下一次借记,然后计算下一次借记的时间已全额支付。

最后我希望得到的结果是:

SubjectID | Date_value | Debit | Credit | PaymentLate |
    1        9/7/2017    11000        0           124
    1        12/7/2017    6000        0           228

因为第一次借记已于 2018 年 1 月 9 日全额支付,而第二次借记已于 2018 年 7 月 23 日全额支付...PaymentLate 是借记之间的日期差异 date_value以及 运行 信用总额达到足够金额的日期。

我确实尝试过 运行 总计和总和,但是当我在全额支付时开始从贷方中扣除借方时我遇到了问题......换句话说,我没有走得太远.

我使用的是 Oracle 11.1.0.7.0 企业版。

下面的语句应该可以解决问题:

WITH sum_data AS (SELECT subject_id
                       , date_value
                       , debit
                       , credit
                       , SUM(debit) over(PARTITION BY subject_id 
                                         ORDER BY date_value
                                         ROWS UNBOUNDED PRECEDING) SUM_debit
                       , SUM(credit) over(PARTITION BY subject_id 
                                          ORDER BY date_value
                                          ROWS UNBOUNDED PRECEDING) SUM_credit
                   FROM IncomeTest )
SELECT d.subject_id
     , d.date_value
     , d.debit
     , d.credit
     , GREATEST( (SELECT MIN(date_value) 
                    FROM sum_data d2
                   WHERE d2.SUM_credit >= d.sum_debit
                     AND d2.subject_id  = d.subject_id) - date_value
               ,0) PaymentLate 
  FROM sum_data d
 WHERE debit != 0