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?
Любая помощь приветствуется.
Ответы
Ответ 1
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: выполняется подсчет строк для запроса "минута"
Ответ 2
Вот простой запрос, который вы можете либо обернуть в функцию, либо вырезать и вставить по всему месту:
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.