gpt4 book ai didi

mysql - SQL 或 MYSQL 中的函数是否有任何方法可以汇总列中的所有增量?

转载 作者:行者123 更新时间:2023-11-29 09:42:12 26 4
gpt4 key购买 nike

我想找到一种方法来总结列值中的所有增量。

我们为客户提供送货服务。客户可以随用随付,但如果他支付预付费用,他会得到更好的交易。有一张表记录了客户在一段时间内的余额。所以我想将所有增量求和到余额。我无法更改付款记录方式。

我已经编写了一个可以工作的存储过程,但速度有点慢,所以我正在寻找替代方案。我认为,也许,可以完成此任务的 sql 语句可以胜过我的具有循环的存储过程。

我的存储过程在给定的日期范围内选择客户,并将结果插入到临时表 X 中。之后,它开始从 X 表中弹出行,将该行中的余额值与前一行进行比较row,并检测是否有增量。如果没有增量,则弹出另一行并执行相同的例程,如果有增量,则计算该行与前一行之间的差,并将结果插入到另一个临时表 Y 中。

当没有剩余行时,存储过程会对临时表 Y 执行 SUM,这样您就可以知道客户“补充”了多少余额。

这是表 X 的示例,以及预期结果:

DATE        BALANCE
---- -------
2019-02-01 200
2019-02-02 195 //from 200 to 195 there is a decrement, so it doesn't matter
2019-02-03 180
2019-02-04 150
2019-02-05 175 //there is an increment from 150 to 175, it's 25 that must be inserted in the temp table
2019-02-06 140
2019-02-07 180 //there is another increment, from 140 to 180, it's 40

因此生成的临时表 Y 必须是这样的:

REFILL
------
25
40

预期结果是 65。我的存储过程返回这个值,但正如我所说,有点慢(处理 3900 行大约需要 22 秒,相当于 3 天,大约),我认为是因为循环。我想探索另一种选择。因为我在这里没有提到一些细节,对于单个客户,我每天可以有 1300 行(示例以天为单位给出,但我按分钟有行)。我认为我的表已建立索引。我无法发布我的存储过程,但它按描述工作(我知道“魔鬼在于细节”)。因此,任何建议将不胜感激。

最佳答案

使用用户定义的变量来保存上一行的余额,然后从当前行的余额中减去它。

SELECT SUM(refill) AS total_refill
FROM (
SELECT GREATEST(0, balance - @prev_balance) AS refill, @prev_balance := balance
FROM (
SELECT balance
FROM tableX
ORDER BY date) AS t
CROSS JOIN (SELECT @prev_balance := NULL) AS ars
) AS t

关于mysql - SQL 或 MYSQL 中的函数是否有任何方法可以汇总列中的所有增量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56402774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com