在列SQL中运行(平均真实范围)计算

时间:2018-08-08 18:20:10

标签: sql-server tsql

我有一个价格数据的数据集,想对所有大于21的行进行正在进行的ATR(平均真实范围)的计算。第21行是第2-21行的AVG([TR]),等于到353.7。

对于[ATR_20]列的其余部分,需要连续进行的计算将是:

     ATR_20 (after row 21) = (([Previous ATR_20]*19)+[TR])/20

我的数据集:

Date        Open    High    Low     Close   TotalVolume Prev_Close  TR_A  TR_B  TR_C   TR    ATR    

2017-02-01  5961    5961    5425    5498    22689       NULL        536   NULL  NULL   NULL  NULL 
2017-02-02  5697    5868    5615    5734    22210       5498        253   370   117    370   NULL
2017-02-03  5742    5811    5560    5725    15852       5734        251   77    174    251   NULL
2017-02-06  5675    5679    5545    5554    9777        5725        134   46    180    180   NULL
2017-02-07  5597    5613    5426    5481    12692       5554        187   59    128    187   NULL
2017-02-08  5459    5630    5450    5625    9134        5481        180   149   31     180   NULL
2017-02-09  5615    5738    5532    5668    10630       5625        206   113   93     206   NULL
2017-02-10  5651    5661    5488    5602    9709        5668        173    7    180    180   NULL
2017-02-13  5700    6195    5639    6161    26031       5602        556   593   37     593   NULL
2017-02-14  6197    6594    6073    6571    35969       6161        521   433   88     521   NULL
2017-02-15  6510    6650    6275    6492    22046       6571        375   79    296    375   NULL
2017-02-16  6505    6680    6325    6419    12515       6492        355   188   167    355   NULL
2017-02-17  6434    6670    6429    6658    14947       6419        241   251   10     251   NULL
2017-02-21  6800    6957    6603    6654    23838       6658        354   299   55     354   NULL
2017-02-22  6704    6738    6145    6222    25004       6654        593   84    509    593   NULL
2017-02-23  6398    6437    5901    6343    46677       6222        536   215   321    536   NULL
2017-02-24  5280    5589    5260    5404    51757       6343        329   754   1083   1083  NULL
2017-02-27  5437    5461    5260    5300    19831       5404        201   57    144    201   NULL
2017-02-28  5258    5410    5167    5195    15900       5300        243   110   133    243   NULL
2017-03-01  5251    5299    5052    5215    16958       5195        247   104   143    247   NULL
2017-03-02  5160    5231    5063    5130    17805       5215        168   16    152    168   353.7
2017-03-03  5141    5363    5088    5320    14516       5130        275   233   42     275   NULL

我通过以下内容达到了这一点

WITH cte_ACIA ([RowNumber], [Date], [Open], [High], [Low], [Close], 
     [Prev_Close], [TotalVolume], [TR_A], [TR_B], [TR_C])
AS
(SELECT 
    ROW_NUMBER() OVER (ORDER BY [Date] ASC) RowNumber,
    [Date],
    [Open],
    [High],
    [Low],
    [Close],
    LAG([Close]) OVER(ORDER BY [Date]) AS Prev_Close,
    [TotalVolume],
    ROUND([High]-[Low], 5) AS TR_A,
    ABS(ROUND([High]-LAG([Close]) OVER(ORDER BY [Date]), 5))  AS TR_B,
    ABS(ROUND([Low]-LAG([Close]) OVER(ORDER BY [Date]), 5))  AS TR_C,
    FROM NASDAQ.ACIA_TEMP)

SELECT  [RowNumber], [Date], [Open], [High], [Low], [Close], [Prev_Close], 
        [TotalVolume], [TR_A], [TR_B], [TR_C], [TR],
        CASE
            WHEN RowNumber = 21 THEN AVG([TR]) OVER (ORDER BY [Date] ASC ROWS 19 PRECEDING)
        END AS ATR_20  
FROM 
    (
     SELECT [RowNumber],[Date],[Open],[High],[Low],[Close],
            IIF(RowNumber = 1, NULL, Prev_Close) Prev_Close,
            [TotalVolume],
            [TR_A],
            IIF(RowNumber > 1, [TR_B], NULL) TR_B,
            IIF(RowNumber > 1, [TR_C], NULL) TR_C,
            CASE
                WHEN TR_A > TR_B AND TR_A > TR_C THEN TR_A
                WHEN TR_B > TR_A AND TR_B > TR_C THEN TR_B
                ELSE TR_C
            END AS TR
     FROM cte_ACIA) sub

如果您有任何疑问或需要澄清什么,请告诉我。

1 个答案:

答案 0 :(得分:0)

我想您只是在寻找提示。否则,您将发布表定义。我们没有基本的内容,因此无法为您构造查询。但是,这里有提示!将聚合窗口函数与OVER子句一起使用,以指定ROWS PRECEDING。

请参见SELECT - OVER Clause