根据具有匹配 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
值进行数学运算。
我有一个 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
值进行数学运算。