Сгруппируйте запрос mysql с интервалом в 15 минут

У меня есть система мониторинга, которая собирает данные каждые n секунд (n примерно 10, но меняется). Я хочу агрегировать собранные данные по 15-минутным интервалам. Есть ли способ объединить значения временной метки в 15-минутные фрагменты, чтобы группировка работала?


person gsiener    schedule 08.05.2010    source источник


Ответы (10)


Попробуйте это, группируя записи с интервалом 15 минут, вы можете изменить 15 * 60 на интервал в секундах, который вам нужен

SELECT sec_to_time(time_to_sec(datefield)- time_to_sec(datefield)%(15*60)) as intervals from tablename
group by intervals
person BenG    schedule 09.06.2011
comment
Мне больше всего нравится этот подход, потому что он сохраняет минутный интервал в качестве одного из столбцов imo, что делает его более читаемым. Спасибо. - person MrB; 30.09.2012
comment
Это мне тоже помогло! Спасибо. Это нужно было часами, поэтому я изменил (15 * 60) на (60 * 60) - person plocks; 18.06.2015
comment
Это не работает, если записи содержат несколько дат, потому что тогда группируются все записи с одинаковым временем по датам. - person hepabolu; 07.05.2017
comment
@BenG: Большое спасибо. Это просто дает мне нужный результат. - person vijay; 06.10.2020

Адаптация подхода 1) ниже:

select Round(date_format(date, "%i") / (15*60)) AS interval  
from table
group by interval 

Адаптация подхода 3) ниже:

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;

Несколько подходов я нашел здесь :

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;

(Также здесь: http://www.bradino.com/mysql/dayparting-on-datetime-field-using-substring/)

РЕДАКТИРОВАТЬ: все решения будут плохо работать в таблице с большим количеством записей.

person Martin Vseticka    schedule 08.05.2010
comment
хорошо - как бы вы приспособили их для группировки по 15-минутным диапазонам? - person nickf; 08.05.2010
comment
Так же, как и ~ unutbu. Но он был быстрее :-) - person Martin Vseticka; 08.05.2010

Я начал с ответа, данного unutbu, но не получил того, что мне нужно, и мне пришлось немного добавить к нему.

Select Created, from_unixtime(FLOOR(UNIX_TIMESTAMP(Created)/(15*60))*(15*60)) GroupTime, COUNT(*) as Cnt FROM issue i GROUP BY GroupTime

Этот код делит на 900 секунд за 15-минутный промежуток, затем выравнивает значение и умножает его обратно на 900, по существу округляя до ближайшего 15-минутного приращения.

person James    schedule 20.05.2013

Следующие запросы группируют строки и создают временные метки с 15-минутными интервалами.

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 


Например, отметки времени
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

Сгруппированы в 2016-11-09 13:30:00

  1. sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
    Верхняя граница времени до ближайшего 15-минутного интервала. например 12:10 -> 12:15

  2. concat( date(created_dt) , ' ', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
    Создает метку времени, беря дату из поля метки времени.

person Vineeta Khatuja    schedule 09.11.2016

Временные метки Unix: доведите их до ближайшего 15 минут, используя одно из следующих значений:

timestamp div (15 * 60) * (15 * 60) -- div is integer division operator
timestamp - timestamp % (15 * 60)

Дата и время: если тип данных не содержит дробных секунд, округлите их до ближайших 15 минут, используя:

date - INTERVAL EXTRACT(SECOND FROM date) SECOND - INTERVAL EXTRACT(MINUTE FROM date) % 15 MINUTE

DBFiddle

person Salman A    schedule 18.09.2018

Это сработало для меня

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)
person Vitaly Nikolaev    schedule 09.02.2012

Это работа для меня

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;
person Chandrakant Thakkar    schedule 20.06.2019

Измените «15» на любой желаемый интервал.

select count(*),
CONCAT(HOUR(col_date),":",(MINUTE(create_date) div 15)*15) as date
from tablename
GROUP BY date
ORDER BY col_date ASC;
person Robert Chan    schedule 01.08.2019

GROUP BY меня не устроил.

SELECT   datetime
FROM     table
WHERE MOD(MINUTE(TIME(datetime)),15) = 0 AND SECOND(TIME(datetime)) = 0;
person Webist    schedule 03.10.2020

person    schedule
comment
Разве это не должно быть UNIX_TIMESTAMP(timestamp)/(15 * 60) в течение нескольких минут? - person Alexander Gladysh; 08.05.2010
comment
Я не думаю, что здесь следует использовать ROUND. DIV более уместен. UNIX_TIMESTAMP(timestamp) DIV (15 * 60) Потому что SELECT ROUND (1.8), ROUND (2.1) попадут в один и тот же сегмент, хотя и не должны. Ссылка: stackoverflow.com/a/3086470/412786 - person tzzzoz; 19.11.2015
comment
ROUND дает 15-минутный интервал, отличный от DIV, но оба дают 15-минутные интервалы. - person unutbu; 19.11.2015
comment
Я думаю, что использование FLOOR даст лучший результат, чем функция ROUND: 00:00:00 будет сгруппирован со значениями до 00:14:59. Я думаю, это более естественная концепция. - person kmas; 15.11.2017
comment
Я бы использовал CEIL. Если вы используете 10-минутный интервал, FLOOR дает 5,15,25, но ceil дает 0, 10, 20, что является более правильным разделением - person eSKon; 24.06.2019
comment
FLOOR(UNIX_TIMESTAMP(timestamp)/(15 * 60)) * 15 * 60, если вы хотите получить правильную метку времени из запроса - person Tofandel; 07.08.2020