2010-04-05 9 views
17

¿Cómo cuento el número de registros en una tabla MySQL basada en una columna de marca de tiempo por unidad de tiempo donde la unidad de tiempo es arbitraria?Grupo de datos MySQL en intervalos de tiempo de tamaño arbitrario

Específicamente, quiero contar cuántas marcas de tiempo del registro cayeron en intervalos de 15 minutos durante un intervalo determinado. Entiendo cómo hacer esto en intervalos de 1 segundo, 1 minuto, 1 hora, 1 día, etc. utilizando las funciones de fecha de MySQL, p. Ej.

SELECT YEAR(datefield) Y, MONTH(datefield) M, DAY(datefield) D, COUNT(*) Cnt FROM mytable GROUP BY YEAR(datefield), MONTH(datefield), DAY(datefield) 

pero ¿cómo puedo agrupar por 15 cubos de minuto?

Respuesta

21
GROUP BY 
    YEAR(datefield), 
    MONTH(datefield), 
    DAY(datefield), 
    HOUR(datefield), 
    FLOOR(MINUTE(datefield)/15) 

Se podría decir que, alternativamente, simplemente:

SELECT FLOOR(UNIX_TIMESTAMP(datefield)/900) AS t, COUNT(*) AS cnt 
FROM mytable 
GROUP BY t 

con la aplicación responsable de formatear la marca de tiempo para cada periodo de 15 minutos en volver a leer A/M/d/h/m. (Si es necesario tener tiempo local en una zona horaria no alineados cuartos de hora loca, que había necesidad de una compensación, aunque truco.)

4

¿Qué le parece obtener el INTEGER de (HOUR (DateField) * 60 + MINUTES (DateField))/YourInterval.

De esta forma, sin importar el intervalo, al incluir la hora * 60 minutos se mantendrá secuencialmente durante un día determinado y no se tratarán solo 15 minutos agrupados por hora, sino cada 15 minutos de su PROPIO hora ... Agregue esa columna a su grupo por cláusula que puede hacer por su posición ordinal.

3

Sólo para hacerle pensar, aquí es una alternativa a la solución FLOOR(MINUTE(datefield)/15):

GROUP BY CASE 
WHEN MINUTES(datetime) BETWEEN 0 AND 14 THEN 0 
WHEN MINUTES(datetime) BETWEEN 15 AND 29 THEN 1 
WHEN MINUTES(datetime) BETWEEN 30 AND 44 THEN 2 
WHEN MINUTES(datetime) BETWEEN 45 AND 59 THEN 3 
END 
+0

@Marcus: ¿En qué se diferencia el resultado de usar FLOOR? –

+1

@Eric J., el resultado es el mismo. Solo otra forma de hacerlo. –

+0

Tenía un montón de enteros unixtime. Usando esto podría configurar los "intervalos de tiempo" en el código (intervalos de un mes, por lo que no todos los intervalos son iguales). – Martijn

Cuestiones relacionadas