我希望在前一行的总和达到定义的阈值后更新以下行。我正在使用MySQL,并试图想办法只使用SQL来解决这个问题。
这是一个例子。具有阈值100.在行中迭代,当前一行的总和> 1时,设置以下行以进行检查。
Before the operation: | id | amount | checked | | 1 | 50 | false | | 2 | 50 | false | | 3 | 20 | false | | 4 | 30 | false | After the operation: | id | amount | checked | | 1 | 50 | false | | 2 | 50 | false | <- threshold reached (50 + 50 >= 100) | 3 | 20 | true* | | 4 | 30 | true* |
是否可以仅使用SQL查询来执行此操作?我需要存储过程吗?我怎么能用这两个解决方案实现它?
答案 0 :(得分:1)
您可以通过计算累计金额并使用update
和join
执行此操作:
update table t join
(select t.*, (select sum(amount) from table t2 where t2.id <= t.id) as cum
from table t
) tcum
on tcum.id = t.id and tcum.cum >= 100
set checked = true;
编辑:
为了提高性能,您可以使用变量。以下应该是正确的方法:
update table t join
(select t.*, (@cum := @cum + amount) as cum
from table t cross join
(select @cum := 0) vars
order by t.id
) tcum
on tcum.id = t.id and tcum.cum >= 100
set checked = true;
答案 1 :(得分:0)
这样的东西?没有经过测试,所以它可能需要一两个调整,但这应该做你想要的。
UPDATE table t,
(SELECT
@a := @a + amount AS cumulative_sum
FROM table
JOIN (SELECT @a := 0) as whatever
) temp
SET t.checked = true WHERE temp.cumulative_sum >= 100 ;