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

MySQL 5分钟移动平均(按日期范围分组行),mysql,moving-average,Mysql,Moving Average,我试图从以下格式的数据中获得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:3

我试图从以下格式的数据中获得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
此处演示:


效果很好。在旁注中,我意识到由于某种原因,我无法对视图执行此操作(当我将数据从视图复制到表中时,它就工作了……但对视图运行的相同查询会变得疯狂)。。。我已经为此工作了好几天了,所以我不想再浪费时间去想原因了。谢谢你,我明白了为什么我的视图不起作用了——因为我有多个ID——我如何在子查询中按不同的ID分组?我看不到其他/实际数据,所以我恐怕我的答案是我现在能做的最好的了。你可以用更多的信息更新你的问题,但是如果这会使我的答案完全无效,那么你真的应该问另一个问题。谢谢蒂姆,你的答案帮了我的忙-如果你能把它记下来。。。哈哈,我希望有一天能到那里:迪德里克,你现在到了吗。