viernes, 21 de junio de 2013

MYSQL: Agrupar datos estadísticos por intervalos de minutos, horas, etc.

A la hora de mostrar datos estadísticos en el tiempo a partir de una tabla en MySQL podemos necesitar agrupar datos en intervalos. En ese caso, no existe una función MySQL que nos sirva, y tenemos que echar mano del ingenio para conseguir nuestro objetivo.

Para explicar lo que tenemos que hacer tendremos una tabla con datos almacenados por minuto:
 _________________________________
|       date            |   num   |
|_______________________|_________|
|  2013-02-01 12:46:00  |    21   |
|  2013-02-01 12:42:00  |    33   |
|  2013-02-01 13:27:00  |    73   |
|_______________________|_________|

A continuación os muestro la solución que yo he encontrado:
SELECT TIME(DATE_SUB(d1.date,INTERVAL (MINUTE(d1.date)%10) MINUTE)) as tiempo, SUM(IFNULL(d1.num,0)) as suma FROM tabla GROUP BY tiempo ORDER BY d1.id DESC

Como podéis ver, se trata de mostrar el dato de tiempo en intervalos de X minutos y, después, agrupar. En mi ejemplo, he querido hacer intervalos de 10 minutos. La fórmula para obtener todas las fechas en intervalos de 10 minutos es la resultante de restar (DATE_SUB) a la fecha actual los minutos restantes de la división (%) de los minutos en la hora actual (MINUTE()) entre 10. Una vez obtenido el nuevo dato de tiempo sólo nos queda agrupar los datos. El resultado es similar a este:
 __________________________________
|         tiempo        |   suma   |
|_______________________|__________|
|  2013-02-01 12:40:00  |    54    |
|  2013-02-01 13:20:00  |    73    |
|_______________________|__________|

Daros cuenta que si hubiera que hacerlo por segundos o por horas sólo tendríamos que aplicar la resta al dato obtenido (tiempo). 

5 comentarios:

  1. Muchas gracias por tu aporte, la probe modificandola un poco para la tabla q utilizo, y me funciono de las mil maravillas.

    ResponderEliminar
  2. esto mismo se podria hacer por dias ?

    ResponderEliminar
    Respuestas
    1. Claro, aunque en ese caso yo agruparía los datos usando la función DATE sobre el campo del tiempo (supongo que será un DATETIME).

      Eliminar
  3. necesito ayuda con lo siguiente, quiero agrupar por intervalo de horas desde las 8 am a 17 pm y desde las 18 pm a las 7 am

    ResponderEliminar