微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据前一行中的值计算 MariaDB 中的新值

如何解决根据前一行中的值计算 MariaDB 中的新值

在 MariaDB 10.3 中,我有一个这样的表:

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

我找到了一些接近的解决方案,但无法以适当的方式更改它们以满足我的需要。任何想法将不胜感激。

最后一列的逻辑是:

  1. 一个值是欠款总额 (120+130+140...)
  2. 每个下一个值都是根据该数字减去同一行总和列中的值计算得出的 即
  • 870-120=750;
  • 750-130=620;
  • 620-140=480;等

我的尝试是:

  1. 一个接近但不起作用的查询
    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

即它有点颠倒了结果。并用下一行的值增加该值。

  1. 一个查询是使用 LAG 函数,但减法部分令人失望
    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 举报,一经查实,本站将立刻删除。