SQL 中基于先前值的动态更新

Posted

技术标签:

【中文标题】SQL 中基于先前值的动态更新【英文标题】:Dynamic update in SQL based on previous value 【发布时间】:2020-08-21 07:56:18 【问题描述】:

我正在尝试探索动态更新。

我的实际源表是:

更新后源表的预期结果:

我试过的查询:

WITH t AS
(
    SELECT key,
           Begin_POS,
           Length,
           (Begin_POS+ Length) as res
    from   tab
)
SELECT src_column_id,
       Length,res,
       COALESCE(Length + lag(res) OVER (ORDER BY src_column_id),1)  AS PRE_VS
from t

你能帮助我的方法应该是什么样的吗?

【问题讨论】:

【参考方案1】:

我认为这是一个窗口总和:

select 
    t.*,
    1 + coalesce(
        sum(length) over(
            order by key 
            rows between unbounded preceding and 1 preceding
        ), 
        0
    ) new_begin_pos
from mytable t

【讨论】:

完美。希望我必须将其用作更新查询中的临时表才能获得最终结果? 你的问题中没有临时表,@Madan。【参考方案2】:

你可以像这样使用SUM()窗口函数:

select
  [key],
  sum(length) over (order by [key]) - length + begin_pos begin_pos,
  length
from tab

如果要更新表格:

with cte as (
  select *, sum(length) over (order by [key]) - length + begin_pos new_begin_pos
  from tab
)
update cte 
set begin_pos = new_begin_pos

请参阅demo。 结果:

> key | begin_pos | length
> --: | --------: | -----:
>   1 |         1 |      1
>   2 |         2 |      9
>   3 |        11 |      3
>   4 |        14 |      7
>   5 |        21 |      3
>   6 |        24 |      6
>   7 |        30 |     16

【讨论】:

以上是关于SQL 中基于先前值的动态更新的主要内容,如果未能解决你的问题,请参考以下文章

Zeppelin - 动态表单中默认值的动态更新

仅包含具有更新值的列的动态更新语句

SQL Server - 使用内部查询自联接更新值的代码

如何在rails中使用动态绑定执行原始更新sql

SQL 动态列和更新多列

laravel - 基于先前选择的动态下拉列表