Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于上一行和同一计算列计算列值_Sql_Tsql - Fatal编程技术网

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

Sql 基于上一行和同一计算列计算列值,sql,tsql,Sql,Tsql,我正在努力根据Val1和Val2计算Calc Calc=previous\u row.Calc+previousr\u row.Val1-previous\u row.Val2 输入数据按日期排序 预期产出: +---------+--------+------------+------+ | Val1 | Val2 | Date | Calc | +---------+--------+------------+------+ | 0,00 | 0,00 | 2

我正在努力根据
Val1
Val2
计算
Calc

Calc
=
previous\u row.Calc
+
previousr\u row.Val1
-
previous\u row.Val2

输入数据按日期排序

预期产出:

+---------+--------+------------+------+
|  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(按日期排序)-LAG(Val2)OVER(按日期排序)

在真实场景中,我将添加分区,但情况不同。现在我想保持简单

更新: 受他人启发:

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

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


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

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

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

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

select t.*,
       max(val1) over (order by date) - sum(val2) over (order by date)
from t;
ALTER函数计算(@lagDate)
返回整数
作为
开始
如果@lagDate为空
返回0
声明@r INT
选择@r=isnull(滞后(val1)超过(按[日期]订购),0)-
isnull(滞后(val2)超过(按[日期]订购),0+
dbo.calc(延迟([日期])超过(按[日期]订购)
来自dbo.ss
其中[date]
ALTER函数计算(@lagDate-date)
返回整数
作为
开始
如果@lagDate为空
返回0
声明@r INT
选择@r=isnull(滞后(val1)超过(按[日期]订购),0)-
isnull(滞后(val2)超过(按[日期]订购),0+
dbo.calc(延迟([日期])超过(按[日期]订购)
来自dbo.ss

地点[日期]请发布您的尝试。听起来你比你想象的更接近了。我更新了我的问题。此外,受@Gordon Linoff的启发,我的版本提出了一个问题:这是否是有效的解决方案。请发布您的尝试。听起来你比你想象的更接近了。我更新了我的问题。此外,受@Gordon Linoff的启发,我的版本提出了一个问题:这是否是有效的解决方案。似乎有效,但我找到了更简单的解决方案。谢谢你。你能告诉我你的解决方案吗?你会在我的帖子中找到它,更新似乎是可行的,但我找到了更简单的解决方案。谢谢你。你能告诉我你的解决方案吗?你会在我的帖子“更新”中找到答案,这不完全是答案,但启发了我去寻找答案。我已经用解决方案更新了我的问题。不完全是答案,但激发了我去寻找答案。我已经用解决方案更新了我的问题。