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

Calculate new value in MariaDB based on values in the previous row

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

id date 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 date sum remaining total sum before pay
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. 每个下一个值都是根据该数字减去同一行上总和列中的值计算得出的 即

我的尝试是:

  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 date sum remaining total sum before pay
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 date remaining total sum before pay
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

减去:

您只需要 SUM() window 函数:

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