date_trunc 5-минутный интервал в PostgreSQL
Возможный дубликат:
Какой самый быстрый способ урезать метки времени до 5 минут в Postgres?
Postgresql SQL GROUP BY временной интервал с произвольной точностью (до миллисекунд)
Я хочу агрегировать данные с 5-минутным интервалом в PostgreSQL. Если я использую date_trunc()
функция, я могу агрегировать данные с интервалом в час, месяц, день, неделю и т. д., но не в определенный интервал, например, 5 минут или 5 дней.
select date_trunc('hour', date1), count(*) from table1 group by 1;
Кто-нибудь знает, как мы можем добиться этого в PostgreSQL?
Любая помощь приветствуется.
2 ответа
SELECT date_trunc('hour', date1) AS hour_stump
,(extract(minute FROM date1)::int / 5) AS min5_slot
,count(*)
FROM table1
GROUP BY 1, 2
ORDER BY 1, 2;
Вы могли бы GROUP BY
две колонки: временная метка, усеченная до часа и 5-минутный интервал.
Пример производит слоты 0 - 11
, добавлять 1
Если вы предпочитаете 1 - 12
,
Я бросил результат extract()
целое число, поэтому деление / 5
усекает дробные цифры. Результат:
минута 0 - 4 -> слот 0
минут 5 - 9 -> слот 1
и т.п.
Этот запрос возвращает значения только для тех 5-минутных интервалов, в которых они найдены. Если вам нужно значение для каждого слота или если вы хотите получить промежуточную сумму за 5-минутные слоты, рассмотрите следующий связанный ответ:
PostgreSQL: подсчет количества строк для запроса "по минутам"
Вот простой запрос, который вы можете обернуть в функцию или вырезать и вставить везде:
select now()::timestamp(0), (extract(epoch from now()::timestamptz(0)-date_trunc('d',now()))::int)/60;
Это даст вам текущее время и число от 0 до n-1, где n=60 здесь. Чтобы сделать это каждые 5 минут, сделайте это число 300 и так далее. Он группируется по секундам с начала дня. Чтобы сгруппировать его по секундам с начала года, начала часа или чего-либо еще, измените "d" в date_trunc.