por - funciones de agrupamiento en sql
Grupo de consulta mysql por intervalos de 15 minutos (6)
Adaptación del enfoque 1) a continuación:
select Round(date_format(date, "%i") / (15*60)) AS interval
from table
group by interval
Adaptación del enfoque 3) a continuación:
SELECT Round(Convert(substring(date_column, 14, 2), UNSIGNED) / (15*60)) AS interval /* e.g. 2009-01-04 12:20:00 */
FROM table
GROUP BY interval;
Algunos enfoques que he encontrado here :
1)
select date_format(date, "%W") AS `Day of the week`, sum(cost)
from daily_cost
group by `Day of the week`
order by date_format(date, "%w")
2)
select count(*) as ''count'',
date_format(min(added_on), ''%Y-%M-%d'') as ''week commencing'',
date_format(added_on, ''%Y%u'') as ''week''
from system
where added_on >= ''2007-05-16''
group by week
order by 3 desc;
3)
SELECT substring(postdate, 1,10) AS dd, COUNT(id) FROM MyTable GROUP BY dd;
(También aquí: http://www.bradino.com/mysql/dayparting-on-datetime-field-using-substring/ )
EDITAR: todas las soluciones funcionarán mal en una tabla con una gran cantidad de registros.
Tengo un sistema de monitoreo que recolecta datos cada n segundos (n ~ = 10 pero varía). Me gustaría agregar los datos recopilados en intervalos de 15 minutos. ¿Hay alguna forma de acorralar la columna de la marca de tiempo en trozos de 15 minutos para permitir que la agrupación funcione?
Empecé con la respuesta dada anteriormente por unutbu pero no obtuve lo que necesitaba y tuve que agregarle un poco.
Select Created, from_unixtime(FLOOR(UNIX_TIMESTAMP(Created)/(15*60))*(15*60)) GroupTime, COUNT(*) as Cnt FROM issue i GROUP BY GroupTime
Este código se divide por los 900 segundos en un lapso de 15 minutos, luego refuerza el valor y lo multiplica por 900, esencialmente redondeando al incremento de 15 minutos más cercano.
Esto funcionó para mí
mysql> **SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())- UNIX_TIMESTAMP(NOW())%(15*60));**
+---------------------------------------------------------------------+
| FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())- UNIX_TIMESTAMP(NOW())%(15*60)) |
+---------------------------------------------------------------------+
| 2012-02-09 11:15:00 |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)
La consulta agrupa las filas y crea marcas de tiempo a intervalos de 15 minutos.
Select concat( date(created_dt) , '' '', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))as created_dt_new from table_name group by created_dt_new
Por ejemplo, Timestamps
2016-11-09 13:16:29
2016-11-09 13:16:49
2016-11-09 13:17:06
2016-11-09 13:17:26
2016-11-09 13:18:24
2016-11-09 13:19:59
2016-11-09 13:21:17
Se agrupan en 2016-11-09 13:30:00
sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
Tiempo de límites superiores al intervalo de 15 minutos más cercano. por ejemplo, 12:10 -> 12:15concat( date(created_dt) , '' '', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
Genera una marca de tiempo tomando la fecha del campo de marca de tiempo.
Pruebe esto, agrupando registros de intervalos de 15 minutos, puede cambiar 15 * 60 por el intervalo en segundos que necesita
SELECT sec_to_time(time_to_sec(datefield)- time_to_sec(datefield)%(15*60)) as intervals from tablename
group by intervals
SELECT FLOOR(UNIX_TIMESTAMP(timestamp)/(15 * 60)) AS timekey
FROM table
GROUP BY timekey;