MySQL 5-минутное скользящее среднее (группировка строк по диапазонам дат)

Я пытаюсь получить 9-длинную скользящую среднюю 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 временным меткам.


person Derrick Smith    schedule 03.09.2017    source источник


Ответы (1)


Один из способов справиться с этим в 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

Демо здесь:

Рекстестер

person Tim Biegeleisen    schedule 03.09.2017
comment
это сработало прекрасно. Кстати, я понял, что по какой-то причине я не могу сделать это для представления по какой-то причине (когда я скопировал данные из своего представления в таблицу, тогда это работает... тот же запрос, выполняемый для представления, однако сходит с ума) ... Я работаю над этим уже несколько дней, поэтому не собираюсь больше тратить время, пытаясь понять, почему. СПАСИБО - person Derrick Smith; 03.09.2017
comment
Тим, я понял, почему мое представление не работает - потому что у меня более одного идентификатора - как мне сгруппировать по разным идентификаторам в этом подзапросе? - person Derrick Smith; 03.09.2017
comment
Я не вижу других / фактических данных, поэтому боюсь, что мой ответ - лучшее, что я могу сделать прямо сейчас. Вы можете обновить свой вопрос, добавив дополнительную информацию, но если это полностью аннулирует мой ответ, вам действительно следует задать другой вопрос. - person Tim Biegeleisen; 03.09.2017
comment
Спасибо, Тим, твой ответ помог - если бы ты смог написать это сразу же... лол, я надеюсь, что когда-нибудь доберусь до этого: D - person Derrick Smith; 04.09.2017
comment
Деррик – Ты уже добрался? - person Bitcoin Murderous Maniac; 07.05.2020