Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Média de dados para cada 5 minutos nos tempos determinados

Agrupar em intervalos


Você deve usar group by para criar um grupo para cada intervalo sobre o qual você deseja calcular a média.
select avg(Column), convert((min(datetime) div 500)*500 + 230, datetime) as time
from Databasename.tablename 
where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'
group by datetime div 500

Isso faz uso do fato de que uma data e hora podem ser convertidas implicitamente em um número, que terá o formato YYMMDDhhmmss . Dividindo esse número por 100 tira os segundos, e da mesma forma dividindo por 500 produz um número único para cada intervalo de 5 minutos.

A coluna adicional que selecionei dará o meio do intervalo:qualquer hora do intervalo (aqui escolhendo o mínimo, mas isso não importa muito), transformado naquele número de intervalo de 5 minutos, de volta em uma data e hora número e, em seguida, adicionando dois minutos e meio. Você pode usar uma sintaxe semelhante para calcular o início (simplesmente deixe o + 230 out) ou (inclusive) end (+ 459 ) do intervalo.

Testado usando sqlfiddle .

Manuseio de fim de intervalo


Observe que seu BETWEEN intervalo incluirá linhas de 15:30:00 mas nenhum outro do intervalo começou naquele momento. Talvez você queira excluir o final do intervalo de sua seleção:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'

Por que você recebe NULL


Por que sua consulta gera NULL :Para fazer aritmética de intervalo, você não coloca todo o intervalo entre aspas e usa nomes singulares para unidades de tempo. Ou seja
'2012-09-08 15:30:00' + INTERVAL 5 minute

Mas isso simplesmente estenderia o intervalo para 2012-09-08 15:35:00 e ainda não criar os intervalos de 5 minutos que você deseja. Do jeito que você escreveu, você está tentando adicionar duas strings, o que não é possível no MySQL, a menos que as strings possam ser convertidas em números, caso em que esses números serão adicionados.

Você pode querer usar aritmética de intervalo para calcular o final exclusivo do intervalo, ou seja, o primeiro segundo depois o intervalo:
 convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval

Basta adicionar 500 em vez do 230 da minha consulta não funcionará, pois o número resultante pode representar uma data inválida para o último intervalo de cada hora.