【问题标题】:Calculate new value in MariaDB based on values in the previous row根据上一行中的值计算 MariaDB 中的新值
【发布时间】:2021-04-14 03:24:56
【问题描述】:

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

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. 每个下一个值都是根据该数字减去同一行的 sum 列中的值计算得出的 即
  • 870-120=750;
  • 750-130=620;
  • 620-140=480;等

我的尝试是:

  1. 已关闭但无效的第一个查询:
选择 id,s.sum,s.date, @b := @b + s.sum 作为余额 从 (SELECT @b := 0.0) 假人 交叉连接 tpp AS 其中 id=1 订购方式 s.日期;

结果是:

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 函数,但减法部分令人失望
选择 身份证,日期, sum(sum)-LAG(sum) OVER (ORDER BY date) AS l 来自 tpp 其中 id=1 按日期分组,ID 按日期订购

结果:

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

它减去了:

  • 130-120=10;
  • 140-130=10;
  • 150-140=10;等

【问题讨论】:

  • 为什么总和列的第一个数字是870?你没有解释逻辑。为什么是“剩余”总数。剩下什么?表中没有任何东西可以与之关联,因此无法计算它。
  • 另外,如果后续行应该是从先前剩余总数中减去当前“总和”的结果,那么其中有几个是不正确的。例如870-130 不等于 750。你需要澄清你的整个问题。如果您根据您找到的信息展示了一些先前的努力来编写查询来解决它,这也会有所帮助 - 您尝试了哪些查询/查询?请展示最接近解决方案的那个,并说明哪里出了问题。
  • 哦,请告诉我们您使用的 mysql 版本。你也可以阅读Tips for asking a good Structured Query Language (SQL) question
  • 您需要显示您当前的查询以及出了什么问题。老实说,如果您的前端需要这些数据,您可以更轻松地计算它们。
  • 也只是一个提示,人们将股票和交易数据分开是有原因的。

标签: mysql sql mariadb mariadb-10.3


【解决方案1】:

你只需要 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多