小编典典

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

sql

我的数据集如下:

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 Community Server-GPL


阅读 539

收藏
2021-04-07

共1个答案

小编典典

您可以将Window
Functions与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
2021-04-07