【问题标题】:How to update a value based on previous row's value如何根据前一行的值更新值
【发布时间】:2021-11-12 15:08:37
【问题描述】:

我有一个如下表(sql server 2019):

Name  Total  Payment   BalanceForward     Date
A     NULL   NULL      0                  NULL
A     20     40        NULL               01-2021
A     100    50        NULL               02-2021
A     50     80        NULL               03-2021
B     NULL   NULL      30                 NULL
B     50     50        NULL               01-2021
B     50     80        NULL               02-2021
B     50     40        NULL               03-2021
C     NULL   NULL      100                NULL
........

我想要更新“BalanceForward”列,因为它将有Balance Forward of previous row + (current row's Total - current row's Payment)

预期输出:

Name  Total  Payment   BalanceForward   Date
A     NULL   NULL      0                NULL
A     20     40        -20              01-2021
A     100    50        30               02-2021
A     50     80        0                03-2021
B     NULL   NULL      30               NULL
B     50     50        30               01-2021
B     50     80        0                02-2021
B     50     40        10               03-2021
C     NULL   NULL      100              NULL
.......

提供它的最佳方式是什么?任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server sql-server-2019


    【解决方案1】:

    这看起来像你想实现一个运行总计。您可以使用sum over() 窗口函数和updatable CTE 来执行此操作,如下所示:

    with bf as (
        select *,
            Sum(total-payment) over(partition by name order by date)
            + sum(balanceforward) over(partition by name order by date) newbf
        from t
    )
    update bf set balanceforward=newbf
    where balanceforward is null
    

    例如DB<>Fiddle

    【讨论】:

    • 不工作..你可以加一个小提琴吗?
    • @JesusHamdi 当然可以看到this fiddle
    • @JesusHamdi “不工作”是什么意思?
    【解决方案2】:

    这是 Stu 答案的更强大的版本。您可以运行它两次,多次输出相同的结果。

    with bf as (
        select *, sum(total-payment) over(partition by name order by date) + first_value(balanceforward) over(partition by name order by date) newbf
        from t
    )
    update bf set balanceforward=newbf
    where date is not null;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-16
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多