MySQL中使用窗口函数的移动平均

MySQL中使用窗口函数的移动平均,mysql,sql,mysql-8.0,Mysql,Sql,Mysql 8.0,我的数据集如下: Date Price 3 Day Moving Average ------------------------------------------------- 2018-08-01 10 2018-08-02 12 2018-08-03 11 11 (10+12+11)/3\n 2018-08-04 15 12.6

我的数据集如下:

Date              Price     3 Day Moving Average
-------------------------------------------------
2018-08-01         10        
2018-08-02         12       
2018-08-03         11        11    (10+12+11)/3\n
2018-08-04         15        12.67 (12+11+15)/3
2018-08-05         13        13    (11+15+13)/3
2018-08-06         17         ...
2018-08-07         18         …
2018-08-08         20         ..
仅使用MySQL窗口函数就可以实现这一点吗

环境详情: 服务器版本:8.0.12 MySQL社区服务器-GPL

您可以使用:

详细信息:

  • 2前面的
    表示当前行上方的两行(不包括当前行)。我们明确定义了日期的升序。这意味着两个最近的日期,比当前行的日期低
  • 当前行
    表示当前行
  • 代码>允许我们考虑定义范围内的行(包括边界条件)。
  • 由于前两行的移动平均值为
    null
    ,我们可以使用中的
    Row\u number()

您可以在不使用窗口功能的情况下尝试:

select @priceLag := 0, @priceLagLag := 0;
select Date, price, (priceLagLag + priceLag + price) / 3 MovingAverage
from (
  select @priceLagLag priceLagLag, 
         @priceLag priceLag,
         @priceLagLag := @priceLag,
         @priceLag := price,
         price , date
  from tbl
  order by date
) a

是的。请阅读:我使用了相同的查询来获得平均值,但我的要求是前两行应该有空值,换句话说,平均值应该从第三天开始计算。@b链请编辑您的问题并在这里明确提及此问题,谢谢!这就是我试图实现的目标。
select @priceLag := 0, @priceLagLag := 0;
select Date, price, (priceLagLag + priceLag + price) / 3 MovingAverage
from (
  select @priceLagLag priceLagLag, 
         @priceLag priceLag,
         @priceLagLag := @priceLag,
         @priceLag := price,
         price , date
  from tbl
  order by date
) a