2017-09-03 51 views
2

我试图从数据在下面的格式获得的5种分钟价格9长度移动平均线:MySQL的5分钟移动平均线(分组按日期范围行)

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个时间戳分组

回答

0

在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

+0

,完美的工作。在一个侧面说明中,我意识到由于某种原因,我不能这样做,因为某些原因(当我将数据从我的视图复制到一个表然后它工作...对视图运行相同的查询却疯狂) ......我一直在为此工作好几天,尽管如此也不会再浪费时间来弄清楚为什么。谢谢你 –

+0

蒂姆我想出了为什么我的观点不起作用 - 因为我有多个ID - 我如何根据子查询中的不同ID进行分组? –

+0

WHERE t2.symbol_id = t1.symbol_id AND t2.timeline BETWEEN .... –