基于上一行和同一计算列计算列值

92dk7w1h  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(233)

我在努力计算 Calc 基于 Val1 以及 Val2 . Calc = previous_row.Calc + previousr_row.Val1 - previous_row.Val2 输入数据按顺序排列 Date .
预期产量:

+---------+--------+------------+------+
|  Val1   |  Val2  |    Date    | Calc |
+---------+--------+------------+------+
| 0,00    | 0,00   | 2016-01-01 |    0 |
| 1000,00 | 0,00   | 2020-01-01 |    0 |
| 0,00    | 0,00   | 2020-01-15 | 1000 |
| 0,00    | 500,00 | 2020-02-01 | 1000 |
| 0,00    | 300,00 | 2020-03-01 |  500 |
| 0,00    | 0,00   | 2020-03-15 |  200 |
| 0,00    | 200,00 | 2020-04-01 |  200 |
+---------+--------+------------+------+

已尝试lag函数,成功从上一行获取数据,但无法从上一行获取计算值: LAG(Val1) OVER (ORDER By Date) - LAG(Val2) OVER (ORDER BY Date) 在真实场景中,我将添加分区,但情况不同。我现在想保持简单。
更新:受他人启发: SUM(Val1) OVER(ORDER BY Data) - SUM(Val2) OVER(ORDER BY Data) - Val1 + Val2 AS Calc 当它计算出正确的值时,这是有效的吗?
我正在使用最新的sql server 2019/azure sql。

wyyhbhjk

wyyhbhjk1#

我认为您正在寻找累积和函数:

select t.*,
       max(val1) over (order by date) - sum(val2) over (order by date)
from t;
wbrvyc0a

wbrvyc0a2#

ALTER FUNCTION calc (@lagDate DATE)
    RETURNS INT
    AS
    BEGIN
        IF @lagDate IS NULL
            RETURN 0

        DECLARE @r INT

        SELECT @r = isnull(lag(val1) OVER ( ORDER BY [date] ), 0) - 
                    isnull(lag(val2) OVER ( ORDER BY [date] ), 0) + 
                    dbo.calc(lag([date]) OVER ( ORDER BY [date] ))
        FROM dbo.ss
        WHERE [date] <= @lagDate

        RETURN @r
    END
    GO

  SELECT *
        ,dbo.calc([date]) calc
    FROM dbo.ss

相关问题