PostgreSQL date_bin: собрать метрики по интервалам

Категория: Postgresql · Язык: SQL · Обновлено:

date_bin() относит timestamp к началу равного интервала, например к ближайшему 15-минутному окну. Задайте origin, чтобы границы окон совпадали в разных запросах. Для календарных месяцев используйте date_trunc(), потому что шаг date_bin не принимает интервалы в месяцах и крупнее.

Посчитать события по 15 минут

Если created_at имеет тип timestamptz, запрос соберёт количество событий по UTC-окнам и ограничит выборку полуоткрытым диапазоном:

SQL
SELECT
    date_bin(
        INTERVAL '15 minutes',
        created_at,
        TIMESTAMPTZ '2000-01-01 00:00:00+00'
    ) AS bucket,
    count(*) AS event_count
FROM events
WHERE created_at >= $1::timestamptz
  AND created_at < $2::timestamptz
GROUP BY bucket
ORDER BY bucket;

Началом каждого окна служит origin плюс целое число интервалов. Если нужна другая сетка, измените точку отсчёта; если нужен местный календарный день, сначала определите правила часового пояса и перехода на летнее время.

date_bin() появился в PostgreSQL 14. Шаг должен быть положительным и не может содержать месяцы, кварталы или годы. Подстановка $1 и $2 рассчитана на подготовленный запрос драйвера.

Документация: date_bin в PostgreSQL, выпуск PostgreSQL 14.