如何解决根据前一行中的值计算 MariaDB 中的新值
id | 日期 | sum |
---|---|---|
1 | 2020-01-01 | 120 |
1 | 2020-02-01 | 130 |
1 | 2020-03-01 | 140 |
1 | 2020-04-01 | 150 |
1 | 2020-05-01 | 160 |
1 | 2020-06-01 | 170 |
我需要计算每个日期后的剩余金额。像这样的东西。 我需要将计算作为 MariaDB 中的查询进行。
id | 日期 | sum | 支付前剩余总金额 |
---|---|---|---|
1 | 2020-01-01 | 120 | 870 |
1 | 2020-02-01 | 130 | 750 |
1 | 2020-03-01 | 140 | 620 |
1 | 2020-04-01 | 150 | 480 |
1 | 2020-05-01 | 160 | 330 |
1 | 2020-06-01 | 170 | 170 |
我找到了一些接近的解决方案,但无法以适当的方式更改它们以满足我的需要。任何想法将不胜感激。
最后一列的逻辑是:
- 870-120=750;
- 750-130=620;
- 620-140=480;等
我的尝试是:
SELECT id,s.sum,s.date,@b := @b + s.sum AS balance FROM (SELECT @b := 0.0) AS dummy CROSS JOIN tpp AS s where id=1 ORDER BY s.date ;
结果是:
id | 日期 | sum | 支付前剩余总金额 |
---|---|---|---|
1 | 2020-01-01 | 120 | 120 |
1 | 2020-02-01 | 130 | 250 |
1 | 2020-03-01 | 140 | 380 |
1 | 2020-04-01 | 150 | 520 |
1 | 2020-05-01 | 160 | 670 |
1 | 2020-06-01 | 170 | 840 |
即它有点颠倒了结果。并用下一行的值增加该值。
SELECT id,date,sum(sum)-LAG(sum) OVER (ORDER BY date) AS l FROM tpp where id=1 group by date,id ORDER BY date
结果:
id | 日期 | 支付前剩余总金额 |
---|---|---|
1 | 2020-01-01 | null |
1 | 2020-02-01 | 10 |
1 | 2020-03-01 | 10 |
1 | 2020-04-01 | 10 |
1 | 2020-05-01 | 10 |
1 | 2020-06-01 | 10 |
减去:
- 130-120=10;
- 140-130=10;
- 150-140=10;等
解决方法
你只需要 SUM() 窗口函数:
SELECT id,date,SUM(sum) OVER (ORDER BY date DESC) AS l
FROM tpp
WHERE id = 1
ORDER BY date
参见demo。
结果:
> id | date | l
> -: | :--------- | --:
> 1 | 2020-01-01 | 870
> 1 | 2020-02-01 | 750
> 1 | 2020-03-01 | 620
> 1 | 2020-04-01 | 480
> 1 | 2020-05-01 | 330
> 1 | 2020-06-01 | 170
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。