Я пытаюсь выполнить запрос, чтобы получить среднее значение в диапазоне дат, и сгруппировать их по временному интервалу, например среднее значение за каждые 15 минут, а также создать новый столбец new_date
, чтобы указать интервал. База данных будет иметь следующую структуру:
=======================================================================
id | lid | did | measurement | value | date
=======================================================================
1 | 1 | 1 | Temperature | 1 | 2020-04-27 00:04:23
=======================================================================
2 | 1 | 1 | Temperature | 2 | 2020-04-27 01:10:00
=======================================================================
3 | 1 | 1 | Temperature | 3 | 2020-04-27 02:13:00
=======================================================================
4 | 1 | 1 | Temperature | 4 | 2020-04-27 04:23:00
=======================================================================
5 | 1 | 1 | Temperature | 5 | 2020-04-27 05:04:00
=======================================================================
6 | 1 | 1 | Temperature | 10 | 2020-04-27 06:04:21
=======================================================================
7 | 1 | 1 | Temperature | 11 | 2020-04-27 07:04:32
=======================================================================
8 | 1 | 1 | Temperature | 12 | 2020-04-27 08:04:00
=======================================================================
9 | 1 | 1 | Temperature | 13 | 2020-04-27 13:04:00
=======================================================================
10 | 1 | 1 | Temperature | 14 | 2020-04-27 16:04:00
Запрос, который я пытаюсь сделать, пытается получить среднее значение на каждом 6-часовом интервале и хочет изменить новую дату на 00:00:00. , 00:06:00, 00:12:00, et c ...
select id, lid, did, measurement, AVG(value), date,
FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(date)/(60*60*6))*((60*60*6))) as new_date,
FLOOR(UNIX_TIMESTAMP(date)/(60*60*6)) AS timekey from events
where lid = 1 and did = 123 group by timekey
Ожидаемый результат будет: (иметь среднее значение id 1-5, id 6-8 и id 9-10)
==========================================================================================
lid | did | measurement | value | date | new_date | timeKey
==========================================================================================
1 | 1 | Temperature | 3 | 2020-04-27 00:04:23 | 2020-04-27 00:00:00 | 73517
==========================================================================================
1 | 1 | Temperature | 11 | 2020-04-27 06:04:21 | 2020-04-27 06:00:00 | 73518
==========================================================================================
1 | 1 | Temperature | 13.5 | 2020-04-27 13:04:00 | 2020-04-27 12:00:00 | 73519
Фактический результат: (среднее значение id 1-4, id 5-8 и id 9-10)
==========================================================================================
lid | did | measurement | value | date | new_date | timeKey
==========================================================================================
1 | 1 | Temperature | 2.5 | 2020-04-27 00:04:23 | 2020-04-26 23:00:00 | 73517
==========================================================================================
1 | 1 | Temperature | 9.5 | 2020-04-27 05:04:00 | 2020-04-27 05:00:00 | 73518
==========================================================================================
1 | 1 | Temperature | 13.5 | 2020-04-27 13:04:00 | 2020-04-27 11:00:00 | 73519
I Я не уверен, как получается, что интервал дат с 00:00:00 до 05:00:00 в час даты, я использую unix timestamp работает поиск в секунду, но однажды превысит минуты, в некоторых случаях это не удастся UNIX_TIMESTAMP(date)/(60*60*6)
- это часть, которую я пытаюсь создать с помощью временного ключа для группировки одного и того же набора интервалов и получения среднего значения. Столбец new_date
работает не так, как ожидалось, с 6-часовым интервалом, начинающимся с 00:00:00
, но за час до этого.
Я думаю, что запрос может быть неправильным для выполнения чего-то вроде группировки интервалов. Может ли кто-нибудь помочь мне в этом? Как я могу оптимизировать производительность запроса (у меня уже есть индекс на крышке, сделал, измерения и даты, которые можно очень быстро найти)?