SQL Server:根据彼此更新多个记录的最有效方法

时间:2018-03-14 18:27:25

标签: sql sql-server sql-update

我想更新表格中的多条记录" a"相互依赖。表#34; a"的值看起来像:

+------------+---------------+-------+
| date       | transfervalue | value |
+------------+---------------+-------+
| 01.03.2018 | 0             | 10    |
| 02.03.2018 | 0             | 6     |
| 03.03.2018 | 0             | 13    |
+------------+---------------+-------+

更新后的表格" a"应该是这样的:

+------------+---------------+-------+
| date       | transfervalue | value |
+------------+---------------+-------+
| 01.03.2018 | 0             | 10    |
| 02.03.2018 | 10            | 6     |
| 03.03.2018 | 16            | 13    |
+------------+---------------+-------+

最有效的方法是什么?我尝试了三种不同的解决方案,但最后一种解决方案并不起作用。

  • 解决方案1:执行循环并每天迭代以执行更新语句
  • 解决方案2:每天执行更新声明声明
  • 解决方案3:在一个声明中对整个时间跨度进行更新

解决方案3的输出是:

+------------+---------------+-------+
| date       | transfervalue | value |
+------------+---------------+-------+
| 01.03.2018 | 0             | 10    |
| 02.03.2018 | 10            | 6     |
| 03.03.2018 | 6             | 13    |
+------------+---------------+-------+

2 个答案:

答案 0 :(得分:2)

您似乎想要累积总和:

with toupdate as (
      select t.*, sum(value) over (order by date rows between unbounded preceding and 1 preceding) as running_value
      from t
     )
update toupdate
    set transfervalue = coalesce(running_value, 0);

答案 1 :(得分:0)

这应该有效:

    select t1.*, 
       coalesce((select sum(value) from table1 t2 where t2.date < t1.date), 0) MyNewValue
    from table1 t1