【发布时间】:2021-12-07 16:38:05
【问题描述】:
select a, b, Volume
case
when lag(a, 1) over(order by b asc) < a then lag(c, 1) over(order by b asc) + Volume
when lag(a, 1) over(order by b asc) > a then lag(c, 1) over(order by b asc) - Volume
end as c
from Table
所以我想要实现的是...如果之前的a 行大于/小于当前的a 行,那么从上一行c 中添加/减去Volume。
if a > previous a c = previous c + Volume
if a < previous a c = previous c - Volume
但是...没有c 行,因为这是我正在计算的(所以行c 的初始值为0 或NULL)...@987654333 中没有预定义的数据集@。一种数据来自另一种……一种。
如果我必须用另一种语言编写它,我会将c 的值存储在一个单独的变量中,例如previousRow,并在每次迭代时重写它。
我可以在 TSQL 中实现类似的事情吗?
样本数据:
| a | b | Volume | c |
|---|---|---|---|
| 1 | 2020-01 | 10 | 0 |
| 2 | 2020-02 | 20 | 20 |
| 5 | 2020-03 | 40 | 60 |
| 3 | 2020-04 | 30 | 30 |
| 1 | 2020-05 | 10 | 20 |
【问题讨论】:
-
请提供minimal reproducible example,即样本数据和所需结果(包括边缘情况)以及您的尝试。
-
我在问题中放了一个示例表。我正在尝试的代码是我已经发布的。这就是我卡住的地方。
-
可以按B排序(datetimeoffset)
-
@DaleK 给你:investopedia.com/terms/o/onbalancevolume.asp在文章中找到公式
-
仍然不是有效日期?
标签: sql sql-server tsql window-functions