sql >> Base de Datos >  >> RDS >> Mysql

Promedio de datos por cada 5 minutos en los tiempos dados

Grupo a intervalos

Deberías usar group by para crear un grupo para cada intervalo sobre el que desee promediar.

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

Esto hace uso del hecho de que una fecha y una hora se pueden convertir implícitamente en un número, que luego tendrá el formato YYMMDDhhmmss . Dividir ese número por 100 elimina los segundos y, de manera similar, dividir por 500 produce un número único para cada intervalo de 5 minutos.

La columna adicional que seleccioné dará la mitad del intervalo:cualquier momento del intervalo (aquí eligiendo el mínimo, pero en realidad no importa), convertido en ese número de intervalo de 5 minutos, nuevamente en una fecha y hora número, y luego sumando dos minutos y medio. Puede usar una sintaxis similar para calcular el comienzo (simplemente deje el + 230 out) o (inclusive) fin (+ 459 ) del intervalo.

Probado usando sqlfiddle .

Manejo de fin de rango

Tenga en cuenta que su BETWEEN el rango incluirá filas desde 15:30:00 pero ningún otro del intervalo comenzó en ese momento. Tal vez quiera excluir el final del rango de su selección:

where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'

Por qué obtienes NULL

En cuanto a por qué su consulta produce NULL :Para hacer aritmética de intervalos, no encierra todo el intervalo entre comillas y usa nombres singulares para las unidades de tiempo. Es decir,

'2012-09-08 15:30:00' + INTERVAL 5 minute

Pero esto simplemente extendería el rango a 2012-09-08 15:35:00 y sigues sin crear esos intervalos de 5 minutos que quieres. De la forma en que lo escribió, está tratando de agregar dos cadenas, lo que no es posible en MySQL a menos que las cadenas se puedan convertir en números, en cuyo caso se agregarán esos números.

Es posible que desee utilizar la aritmética de intervalos para calcular el final exclusivo del intervalo, es decir, el primer segundo después el intervalo:

 convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval

Simplemente agregando 500 en lugar del 230 de mi consulta no funcionará ya que el número resultante podría representar una fecha no válida para el último intervalo de cada hora.