如何在前一行的总和达到阈值后更新以下行? MySQL的

时间:2014-06-12 15:20:50

标签: mysql sql stored-procedures sql-update

我希望在前一行的总和达到定义的阈值后更新以下行。我正在使用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查询来执行此操作?我需要存储过程吗?我怎么能用这两个解决方案实现它?

2 个答案:

答案 0 :(得分:1)

您可以通过计算累计金额并使用updatejoin执行此操作:

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 ;