根据前一行和相同的计算列计算列值

Posted

技术标签:

【中文标题】根据前一行和相同的计算列计算列值【英文标题】:Calculate column value based on previous row and the same calculated column 【发布时间】:2020-06-10 16:15:20 【问题描述】:

我正在努力根据Val1Val2 计算Calc

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 函数,成功从上一行获取数据,但我无法从上一行获取 Calc 计算值:

LAG(Val1) OVER (ORDER By Date) - LAG(Val2) OVER (ORDER BY Date)

在现实世界的场景中,我将添加 PARTITION BY,但那是另一回事。现在想保持简单。

更新: 受他人启发:

SUM(Val1) OVER(ORDER BY Data) - SUM(Val2) OVER(ORDER BY Data) - Val1 + Val2 AS Calc

虽然它会计算正确的值,但这是否有效?

我正在使用最新的 SQL Server 2019 / Azure SQL。

【问题讨论】:

请发布您的尝试。听起来你比你想象的更接近。 我已经更新了我的问题。此外,受@Gordon Linoff 的启发,我对我的版本提出了疑问,这是否是有效的解决方案。 【参考方案1】:

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

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

【讨论】:

不完全是答案,但激励我找到一个。我已经用解决方案更新了我的问题。【参考方案2】:
    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

【讨论】:

似乎有效,但我找到了更简单的解决方案。谢谢。 你能告诉我你的解决方案吗? 你会在我的“更新”帖子中找到它

以上是关于根据前一行和相同的计算列计算列值的主要内容,如果未能解决你的问题,请参考以下文章

计算 Pandas 中具有相同列值的行的平均值

如何通过比较火花中相同列的两个数据帧来计算列值的数量

计算具有与相同 ID 相关的不同列值的结果

如何计算与 R 中相同列值关联的两个行值的差异?

Sql Server 查询,一共三列,怎样查出第一个列值相同,第二列值最大的第三列的值?

如何将具有相同列值的mysql行分组为一行?