SQL выбор среднего значения в диапазоне дат и группировка по интервалу - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь выполнить запрос, чтобы получить среднее значение в диапазоне дат, и сгруппировать их по временному интервалу, например среднее значение за каждые 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, но за час до этого.

Я думаю, что запрос может быть неправильным для выполнения чего-то вроде группировки интервалов. Может ли кто-нибудь помочь мне в этом? Как я могу оптимизировать производительность запроса (у меня уже есть индекс на крышке, сделал, измерения и даты, которые можно очень быстро найти)?

...