MySQL 5 分钟移动平均线(按日期范围对行进行分组)

MySQL 5 min Moving Average (grouping rows by date ranges)

我正在尝试从以下格式的数据中获取 5 分钟价格的 9 长度移动平均线:

ID、价格、时间线

1   15.36573000 2017-08-31 22:00:00
1   15.29229000 2017-08-31 21:55:00
1   15.23297000 2017-08-31 21:50:00
1   15.23469000 2017-08-31 21:45:00
1   15.23234000 2017-08-31 21:40:00
1   15.25399000 2017-08-31 21:35:00
1   15.26228000 2017-08-31 21:30:00
1   15.21136000 2017-08-31 21:25:00
1   15.29847000 2017-08-31 21:20:00
1   15.32074000 2017-08-31 21:15:00
1   15.32239000 2017-08-31 21:10:00
1   15.27938000 2017-08-31 21:05:00
1   15.25282000 2017-08-31 21:00:00

因此 9 个时间段(45 分钟)的平均值为:

8/31/2017 21:45 through 8/31/2017 21:05 = 15.26840444
8/31/2017 21:40 through 8/31/2017 21:00 = 15.27041889
8/31/2017 21:35 through 8/31/2017 20:55 = 15.27291889

我看到了一些按天计算的移动平均线,但无法确定如何按最后 9 个时间戳分组

在 MySQL 中处理此问题的一种方法是通过相关子查询。请注意,在下面的查询中,我没有计算先前数据点的数量,而是依赖于时间差异(40 分钟)。这似乎更有意义,因为您的数据可能并不总是具有相同数量的点。

SELECT
    CONCAT(CAST(t1.timeline - INTERVAL 40 MINUTE AS CHAR(50)), ' through ',
           CAST(t1.timeline AS CHAR(50))) AS window,
    (SELECT AVG(t2.price) FROM yourTable t2
     WHERE t2.timeline
         BETWEEN t1.timeline - INTERVAL 40 MINUTE AND t1.timeline) AS avg_price
FROM yourTable t1
WHERE
    t1.timeline >= (SELECT MIN(timeline) + INTERVAL 40 MINUTE FROM yourTable)
ORDER BY t1.timeline

此处演示:

Rextester