计算多行的值

Calculate a value over several rows

我正在尝试根据前几行的值更新列。我的数据如下所示:

InvID   InvAmnt PayAmnt orderId
1       10,00   100,00  1
2       20,00   100,00  2
3       30,00   100,00  3
4       40,00   100,00  4

我想做的是更新 table,以便从 PayAmnt 中减去 InvAmnt 的值。但也需要考虑前面的行。这意味着,在第一行中,我只是从 100 中减去 10,得到 90。在第二行中,我从 90(这是第一行中的结果)中减去 20,得到 70,依此类推。所需的输出如下所示:

InvID   InvAmnt PayAmnt orderId
1       10,00   90,00   1
2       20,00   70,00   2
3       30,00   40,00   3
4       40,00   0,00    4

我试着用 window 函数 LAG 这样做:

select ID, InvID, InvAmnt
,LAG(PayAmnt - InvAmnt,1,PayAmnt) OVER (PARTITION BY ID ORDER BY OrderId) - InvAmnt PayAmnt
,orderId
from #payment
order by orderId

但这给了我一个结果,它只考虑了最后一行而不考虑前面的行:

InvID   InvAmnt PayAmnt orderId
1       10,00   90,00   1
1       20,00   70,00   2
1       30,00   50,00   3
1       40,00   30,00   4

这里发生的是,在第一行中,新值是原始 PayAmnt (100) 减去 InvAmnt(10),结果是 90,这是正确的。在第二行中,它从前几行 PayAmnt(100) 减去 InvAmnt(10) 中减去 InvAmnt (70)。结果 70 也是正确的。但在下一行它失败了,因为秒行 PayAmnt 尚未更新为 70,计算结果为 (100 - 20) - 30,这导致错误的 50。 任何想法,如何在没有迭代构造的情况下解决这个问题?

试试下面的一个。这就像减去 PayAmnt 和 运行 invamt 的总和。

SELECT [InvID], [InvAmnt], [orderId],isnull([PayAmnt],0)-SUM(InvAmnt) OVER(ORDER BY [InvID]) as PayAmnt
FROM  #Table1

您可以使用 sum() 窗口函数如下:

Select *, PayAmnt = sum(InvAmnt) over() - Sum(InvAmnt) over(order by orderId)
     from #payment
     order by orderId