[英]Window function to calculate On Balance Volume
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
排,然后添加/。減去Volume
從上一行c
。
if a > previous ac = previous c + Volume
if a < previous ac = previous c - Volume
但是...沒有c
行,因為這是我正在計算的(所以行c
的初始值為 0 或 NULL)... c
沒有預定義的數據集。 一個數據來自另一個......有點。
如果我必須用另一種語言編寫它,我會將c
的值存儲在一個單獨的變量中,例如previousRow
並在每次迭代時重寫它。
我可以在 TSQL 中實現類似的功能嗎?
樣本數據:
一種 | 乙 | 體積 | 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 |
列 c 幾乎歸結為條件滾動總和,不幸的是,sql server 不允許嵌套窗口函數,因此需要一個派生表來建立前一個 a 值。 在那之后,總結一下什么時候你應該有你正在尋找的東西。
試試這個(在上面提供的集合中添加了額外的測試值):
SELECT
T.*,
SUM(
(
CASE
WHEN T.LAG_A IS NULL
THEN 0
WHEN T.A > T.LAG_A
THEN T.VOLUME
ELSE (T.VOLUME*-1)
END
)
) OVER (ORDER BY T.B ASC) AS C
FROM
(
SELECT
MY_TABLE.A,
LAG(MY_TABLE.A, 1) OVER (ORDER BY MY_TABLE.B ASC) AS LAG_A,
MY_TABLE.B,
MY_TABLE.VOLUME
FROM
(VALUES (1,CAST('1/1/2021' AS DATE),10),
(2,CAST('1/2/2021' AS DATE),20),
(5,CAST('1/3/2021' AS DATE),40),
(3,CAST('1/4/2021' AS DATE),30),
(1,CAST('1/5/2021' AS DATE),10),
(8,CAST('1/6/2021' AS DATE),50),
(4,CAST('1/7/2021' AS DATE),70)
) AS MY_TABLE(A,B,VOLUME)
) T
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.