根据具有匹配 ID 的前几行计算总数

Calculating a total based on previous rows with matching ID

我有一个 table 帐户信息,包括起始余额和付款。我试图找到一种方法来确定每笔付款的余额。每一行都有一个帐号、起始余额、付款日期和付款金额。大多数帐户每月只有一次付款,因此很容易确定。其他人可能会多次付款。所以我需要能够看到每笔付款的调整后余额是多少。我使用 rank over 对每个月的付款进行排名,我的 table 目前看起来像这样:

+---------+-----------+---------+-----------+----------+------+
| Account |  St_Date  | St_bal  |  Pay_dt   | Pay_amnt | Rank |
+---------+-----------+---------+-----------+----------+------+
|   12345 | 8/16/2019 | 7544.61 | 8/23/2019 |    -2000 |    1 |
|   12345 | 8/16/2019 | 7544.61 | 8/24/2019 |    -4500 |    2 |
|   12345 | 8/16/2019 | 7544.61 | 8/26/2019 |    -4500 |    3 |
|   12345 | 8/16/2019 | 7544.61 | 9/2/2019  |    -4000 |    4 |
|   12345 | 8/16/2019 | 7544.61 | 9/3/2019  |    -4000 |    5 |
+---------+-----------+---------+-----------+----------+------+

我尝试过使用滞后并将 table 重新连接到自身,但没有得到想要的结果。

我希望大于排名 1 的每一行取 st_bal 并从其上方的排名中减去每笔付款以获得调整后的余额。所以对于排名为 1 的行,adj_bal 是空白的,因为它是第一个。对于等级 2,adj_bal 应该是起始余额减去等级 1 的付款(不应使用等级 2 的付款),对于等级 3,adj_bal 应该是起始余额减去付款从排名 1 和排名 2(不包括排名 3,因为它是计算的行)等等。但是,如果计算将使调整后的余额低于 0,我只希望它填充 0。

+---------+-----------+---------+-----------+----------+------+---------+
| Account |  St_Date  | St_bal  |  Pay_dt   | Pay_amnt | Rank | adj_bal |
+---------+-----------+---------+-----------+----------+------+---------+
|   12345 | 8/16/2019 | 7544.61 | 8/23/2019 |    -2000 |    1 |         |
|   12345 | 8/16/2019 | 7544.61 | 8/24/2019 |    -4500 |    2 | 5544.61 |
|   12345 | 8/16/2019 | 7544.61 | 8/26/2019 |    -4500 |    3 | 1044.61 |
|   12345 | 8/16/2019 | 7544.61 | 9/2/2019  |    -4000 |    4 | 0.00    |
|   12345 | 8/16/2019 | 7544.61 | 9/3/2019  |    -4000 |    5 | 0.00    |
|   67890 | 8/20/2019 | 8563.36 | 8/25/2019 |     -900 |    1 |         |
|   67890 | 8/20/2019 | 8563.36 | 8/27/2019 |     -600 |    2 | 7663.36 |
|   67890 | 8/20/2019 | 8563.36 | 8/29/2019 |    -1500 |    3 | 7063.36 |
|   67890 | 8/20/2019 | 8563.36 | 9/1/2019  |     -500 |    4 | 5563.36 |
+---------+-----------+---------+-----------+----------+------+---------+

基本上,您需要每个帐户和报表期间的滚动付款总和。由于您的余额交错,我正在扣除最新行的付款金额。 (我想这应该是指付款前而不是付款后的余额?)

case
    when "rank" = 1 then null
    -- /* or */ when row_number() over (partition by account, st_date order by pay_dt) = 1
    when st_bal - pay_amnt +
        sum(pay_amnt) over (partition by account, st_date order by pay_dt) > 0 
    then st_bal - pay_amnt +
        sum(pay_amnt) over (partition by account, st_date order by pay_dt)
    else 0.00
end

这确实假设每个日期没有多次付款。这可以通过在求和排序中添加等级来解决。 window 也可以表示为 sum(pay_amnt) over (partition by account, st_date order by pay_dt rows between unbounded preceding and 1 preceding) 而不是调整,但这并不适用于所有平台。确保不要对 null 值进行数学运算。

https://rextester.com/GXRWLA9434