簡體   English   中英

計算平衡量的窗函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM