J'ai un système de surveillance qui collecte des données toutes les n secondes (n est d'environ 10 mais varie). Je voudrais agréger les données collectées par intervalles de 15 minutes. Existe-t-il un moyen de consolider les valeurs d'horodatage en segments de 15 minutes pour permettre au regroupement de fonctionner?
SELECT FLOOR(UNIX_TIMESTAMP(timestamp)/(15 * 60)) AS timekey
FROM table
GROUP BY timekey;
Essayez ceci, regroupement d'enregistrements à 15 minutes d'intervalle, vous pouvez modifier 15 * 60 à l'intervalle en secondes dont vous avez besoin
SELECT sec_to_time(time_to_sec(datefield)- time_to_sec(datefield)%(15*60)) as intervals from tablename
group by intervals
Adaptation de l'approche 1) ci-dessous:
select Round(date_format(date, "%i") / (15*60)) AS interval
from table
group by interval
Adaptation de l'approche 3) ci-dessous:
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;
Quelques approches que j'ai trouvées ici :
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;
(Aussi ici: http://www.bradino.com/mysql/dayparting-on-datetime-field-using-substring/ )
EDIT: Toutes les solutions fonctionneront mal sur une table avec un grand nombre d'enregistrements.
J'ai commencé avec la réponse donnée ci-dessus par unutbu, mais je n'ai pas obtenu ce dont j'avais besoin et j'ai dû y ajouter un peu.
Select Created, from_unixtime(FLOOR(UNIX_TIMESTAMP(Created)/(15*60))*(15*60)) GroupTime, COUNT(*) as Cnt FROM issue i GROUP BY GroupTime
Ce code divise par les 900 secondes sur une période de 15 minutes, puis fixe la valeur et la multiplie par 900, en arrondissant essentiellement à l'incrément de 15 minutes le plus proche.
La requête suivante regroupe les lignes et crée des horodatages à 15 minutes d'intervalle.
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
Par exemple, horodatages
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
Sont regroupés en 2016-11-09 13:30:00
sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
Limites supérieures à l'intervalle de 15 minutes le plus proche. par exemple 12:10 -> 12:15
concat( date(created_dt) , ' ', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
Génère un horodatage prenant la date du champ d'horodatage.
Horodatages Unix : fixez-les à 15 minutes près en utilisant l'une des options suivantes:
timestamp div (15 * 60) * (15 * 60) -- div is integer division operator
timestamp - timestamp % (15 * 60)
Date heure : en supposant que le type de données n'a pas de fraction de seconde, fixez-les à 15 minutes près en utilisant:
date - INTERVAL EXTRACT(SECOND FROM date) SECOND - INTERVAL EXTRACT(MINUTE FROM date) % 15 MINUTE
Ce travail pour moi
SELECT CONCAT (
YEAR(transactionDate)
,'-'
,MONTH(transactionDate)
,'-'
,DAYOFMONTH(transactionDate)
,' '
,HOUR(transactionDate)
,':'
,((floor((MINUTE(transactionDate) / 15)) + 1) * 15) - 1
,':59'
) AS tmp1
,count(*)
FROM tablename
GROUP BY tmp1 limit 20;
Remplacez "15" par l'intervalle de votre choix.
select count(*),
CONCAT(HOUR(col_date),":",(MINUTE(create_date) div 15)*15) as date
from tablename
GROUP BY date
ORDER BY col_date ASC;
Cela a fonctionné pour moi
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)