3

我的数据集如下:

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

4

2 回答 2

6

您可以将窗口函数与 Frames 一起使用:

SELECT
    Date,
    Price,
    CASE WHEN 
           ROW_NUMBER() OVER (ORDER BY DATE) >= 3 THEN 
             AVG(Price) OVER (ORDER BY Date 
                              ROWS BETWEEN 2 PRECEDING AND 
                                           CURRENT ROW) 
         ELSE NULL 
    END AS avg
FROM yourTable
ORDER BY Date;

DB 小提琴演示

细节:

  • 2 PRECEDING表示当前行上方的两行(不包括当前行)。我们在 上明确定义升序Date。所以这意味着两个最接近的日期,低于当前行的日期
  • CURRENT ROW表示当前行。
  • BETWEEN允许我们考虑定义范围内的行(包括边界条件)。
  • 由于您希望移动平均线null用于前两行,因此我们可以使用以下函数检查此Row_number()功能Case .. When
于 2018-10-18T06:33:53.680 回答
0

你可以试试这个,没有窗口功能:

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

演示

于 2018-10-18T07:06:19.317 回答