滚动平均线

问题描述 投票:1回答:1

我正在寻找如何在postgresql中做一个移动平均线。我已经做的是。

with sma as (
select date,
       avg(col) over(order by date rows between 20 preceding and current row) mov_avg
    from eurusd_ohlc
)

select date, lag(mov_avg,1) over(order by date)  from sma

这将产生我的移动平均结果, 但它也计算值 即使没有足够的条款来计算 20期移动平均。我得到的结果如下。

-----------------------------------------------------
|             date         |           sma          |
|2020-02-20 03:27:35.140751|    NULL                |
|2020-02-20 04:19:17.088462|    1.07966             |
|2020-02-20 05:54:44.060929|    1.0796299999999999  |
|2020-02-20 06:41:32.916934|    1.07964             |
|2020-02-20 07:11:59.667919|    1.0794899999999998  |
|2020-02-20 07:26:06.342439|    1.07938             |
|2020-02-20 07:44:15.313053|    1.0792033333333333  |
|2020-02-20 08:06:31.498739|    1.0791971428571427  |
|2020-02-20 08:26:12.278109|    1.07920625          |
|2020-02-20 08:50:23.925312|    1.079178888888889   |
|2020-02-20 09:14:48.951868|    1.079202            |

虽然这样做是正确的,因为它计算了1,2,3,一直到20个值的平均数,然后它实际上是收敛的,但我希望前20行是 "空 "的,因为没有20行来计算平均数,并从第20行开始得到平均数(如果我使用滞后,则为21)。

我怎样才能做到这一点呢?

sql postgresql moving-average trading
1个回答
0
投票

我认为你可以简化逻辑。

select date, avg(col) over (order by date rows between 21 preceding and 1 preceding)
from eurusd_ohlc

用一个 case 表达式,以获得 nulls:

select date,
       (case when row_number() over (order by date) >= 21
             then avg(col) over (order by date rows between 21 preceding and 1 preceding)
        end) as mov_avg
from eurusd_ohlc
© www.soinside.com 2019 - 2024. All rights reserved.