SQL 服务器 - 添加或减去先前的值

SQL Server - Add or Subtract from Previous Value

我正在尝试从这些数据中取得平衡

Date           Logged      Closed
-------------- ----------- -----------
1-Jan-2016     0           0
2-Jan-2016     8           7
3-Jan-2016     8           8
4-Jan-2016     25          11
5-Jan-2016     20          16
6-Jan-2016     14          13
7-Jan-2016     10          12
8-Jan-2016     9           7
9-Jan-2016     12          12
10-Jan-2016    3           4

预期输出是

Date           Logged      Closed      Balance
-------------- ----------- ----------- ----------
1-Jan-2016     0           0           0
2-Jan-2016     8           7           1 
3-Jan-2016     8           8           1
4-Jan-2016     25          11          15
5-Jan-2016     20          16          19
6-Jan-2016     14          13          20
7-Jan-2016     10          12          18
8-Jan-2016     9           7           20
9-Jan-2016     12          12          20
10-Jan-2016    3           4           27

公式为 BALANCE = 上一个余额 + 已记录 - 已关闭。

示例公式:

Jan 5 Balance (15) = 1(prevBalance) + 25(currentLogged) - 11(currentClosed)

我试过这个公式,但没有得到接近预期的结果。

WITH CTE AS (
SELECT
rownum = ROW_NUMBER() OVER (ORDER BY Date),
Date, Logged, Closed
FROM Table
)

SELECT
(prev.Logged - prev.Closed)+ (a.Logged-a.Closed) as [Balance]
FROM CTE

LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1

使用的其他参考资料

SQL Server - Calculate current row value using previous row value

http://blog.sqlauthority.com/2013/09/22/sql-server-how-to-access-the-previous-row-and-next-row-value-in-select-statement/

您可以使用 Window 函数 sum

试试这个:

select 
    t.*,
    sum(logged - closed) over (order by date) balance
from your_table t;

你回答的问题是你计算的时候没有上一行的Balanced(SQL-Server的All-at-once原则)。您的问题有一个隐藏的要求,即计算所有先前行的总和,按日期排序。

试试这个(仅适用于 SQL Server 2012 及更高版本)

SELECT
    [Date], Logged, Closed,
    SUM(Logged) OVER (ORDER BY [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
    - SUM (Closed) OVER (ORDER BY [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Balance
FROM
    <<Table>>

之前的版本:

SELECT
    t.[Date], t.Logged, t.Closed, sub.L - sub.C AS Balanced
FROM
    <<Table>> t
    CROSS APPLY ( SELECT SUM(Logged) AS L, SUM(Closed) AS c FROM <<Table>> WHERE [Date] <= t.[Date]) AS sub