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.