根据上一行中的值计算 MariaDB 中的新值
Posted
技术标签:
【中文标题】根据上一行中的值计算 MariaDB 中的新值【英文标题】:Calculate new value in MariaDB based on values in the previous row 【发布时间】: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 |
我找到了一些接近的解决方案,但无法以适当的方式更改它们以满足我的需要。任何想法将不胜感激。
最后一列的逻辑是:
-
第一个值是欠款总额 (120+130+140...)
每个下一个值都是根据该数字减去同一行的 sum 列中的值计算得出的
即
我的尝试是:
-
已关闭但无效的第一个查询:
结果是:
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 |
即它有点颠倒了结果。并用下一行的值增加值。
-
另一个查询是 LAG 函数,但减法部分令人失望
结果:
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 您需要显示您当前的查询以及出了什么问题。老实说,如果您的前端需要这些数据,您可以更轻松地计算它们。 也只是一个提示,人们将股票和交易数据分开是有原因的。 【参考方案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
【讨论】:
以上是关于根据上一行中的值计算 MariaDB 中的新值的主要内容,如果未能解决你的问题,请参考以下文章