SQL Server 2012 中的平均真实范围

Average True Range in SQL Server 2012

我有一个 table tdate, ticker, open, high, low, close.

declare @t table 
           (
               [Datecol] date,
               Ticker varchar(10),
               [open] decimal (10,2),
               [high] decimal (10,2), 
               [low] decimal (10,2),
               [close] decimal(10,2)
           )

insert into @t values
('20180215', 'ABC', '122.01', '125.76', '118.79' , '123.29')
,('20180216', 'ABC', '123.02', '130.62', '119.94' , '128.85')
,('20180217', 'ABC', '131.03', '139.80', '129.42' , '136.75')
,('20180218', 'ABC', '136.40', '137.95', '124.32' , '127.38')
,('20180219', 'ABC', '127.24', '138.52', '126.70' , '137.47')
,('20180220', 'ABC', '137.95', '142.01', '127.86' , '128.36')
,('20180215', 'JKL', '9.94', '10.30', '9.77' , '10.17')
,('20180216', 'JKL', '10.15', '10.24', '9.70' , '10.02')
,('20180217', 'JKL', '10.01', '10.18', '9.93' , '10.15')
,('20180218', 'JKL', '10.16', '10.20', '9.23' , '9.38')
,('20180219', 'JKL', '9.37', '9.79', '9.36' , '9.68')
,('20180220', 'JKL', '9.69', '10.01', '9.26' , '9.28')

我有兴趣计算每个代码的每日平均真实范围 (ATR)。

ATR = Max(今日高点,昨日收盘价)- Min(今日低点,昨日收盘价)

使用LAG函数,我可以得到昨天的收盘价:

SELECT 
    *,
    ((LAG([close], 1) OVER (PARTITION BY Ticker ORDER BY [Datecol])) - 0) * 1 AS 'yest_close'
FROM 
    @t t


Datecol    Ticker  open     high    low     close   yest_close
--------------------------------------------------------------
2018-02-15  ABC    122.01   125.76  118.79  123.29   NULL
2018-02-16  ABC    123.02   130.62  119.94  128.85  123.29
2018-02-17  ABC    131.03   139.80  129.42  136.75  128.85
2018-02-18  ABC    136.40   137.95  124.32  127.38  136.75
2018-02-19  ABC    127.24   138.52  126.70  137.47  127.38
2018-02-20  ABC    137.95   142.01  127.86  128.36  137.47
2018-02-15  JKL      9.94    10.30    9.77   10.17   NULL
2018-02-16  JKL     10.15    10.24    9.70   10.02   10.17
2018-02-17  JKL     10.01    10.18    9.93   10.15   10.02
2018-02-18  JKL     10.16    10.20    9.23    9.38   10.15
2018-02-19  JKL      9.37     9.79    9.36    9.68    9.38
2018-02-20  JKL      9.69    10.01    9.26    9.28    9.68

如何获得最大值(今天的最高价,昨天的收盘价)?

您可以使用 caseiif in SQL 2012)来查找两个值的 maxmin。 这是一个示例

select
    *, ATR = iif([high] > yest_close, [high], yest_close) - iif([low] > yest_close, yest_close, [low])
from (
    select 
        *, yest_close = lag([close]) over (partition by Ticker order by [Datecol])
    from @t
) t

输出:

Datecol     Ticker   open     high      low     close   yest_close   ATR
------------------------------------------------------------------------
2018-02-15  ABC      122.01   125.76    118.79  123.29  NULL         NULL
2018-02-16  ABC      123.02   130.62    119.94  128.85  123.29       10.68
2018-02-17  ABC      131.03   139.80    129.42  136.75  128.85       10.95
2018-02-18  ABC      136.40   137.95    124.32  127.38  136.75       13.63
2018-02-19  ABC      127.24   138.52    126.70  137.47  127.38       11.82
2018-02-20  ABC      137.95   142.01    127.86  128.36  137.47       14.15
2018-02-15  JKL      9.94     10.30     9.77    10.17   NULL         NULL
2018-02-16  JKL      10.15    10.24     9.70    10.02   10.17        0.54
2018-02-17  JKL      10.01    10.18     9.93    10.15   10.02        0.25
2018-02-18  JKL      10.16    10.20     9.23    9.38    10.15        0.97
2018-02-19  JKL      9.37     9.79      9.36    9.68    9.38         0.43
2018-02-20  JKL      9.69     10.01     9.26    9.28    9.68         0.75