【发布时间】:2019-05-31 23:42:52
【问题描述】:
我想找到一种方法来总结列值中的所有增量。
我们为客户提供送货服务。客户可以随用随付,但如果他支付前期费用,他会得到更好的交易。有一张桌子,上面有客户在一段时间内的余额。所以我想把所有的增量加到余额中。我无法更改付款记录方式。
我已经编写了一个有效的存储过程,但速度很慢,所以我正在寻找替代方案。我认为,也许可以执行此任务的 sql 语句可以胜过具有循环的存储过程。
我的存储过程在给定日期范围内选择客户,并将结果插入到临时表 X 中。之后,它开始从 X 表中弹出行,将该行中的余额值与前一个进行比较行,并检测是否有增量。如果没有增量,则弹出另一行并执行相同的例程,如果有增量,则计算该行与上一行的差,并将结果插入另一个临时表Y中。
当没有剩余行时,存储过程在临时表 Y 中执行求和,因此,您可以知道客户“重新填充”了多少余额。
这是表 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 行(示例以天为单位给出,但我有按分钟计算的行)。我的表被索引了,我认为是正确的。我无法发布我的存储过程,但它按描述工作(我知道“魔鬼在细节中”)。因此,任何建议都会受到赞赏。
【问题讨论】:
-
你用的是什么版本的 MySQL?
-
嗨,我使用的是 5.7.26。