我的数据集如下:
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
答案 0 :(得分:1)
您可以使用Window Functions with 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;
详细信息:
2 PRECEDING
表示当前行上方的两行(当前行除外)。我们在Date
上明确定义了升序。因此,这意味着两个最接近的日期,低于当前行的日期CURRENT ROW
表示当前行。BETWEEN
使我们能够考虑定义范围内的行(包括边界条件)。null
,因此我们可以使用Case .. When
中的Row_number()
函数对此进行检查答案 1 :(得分: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