PostgreSQL date_bin: собрать метрики по интервалам
date_bin() относит timestamp к началу равного интервала, например к ближайшему 15-минутному окну. Задайте origin, чтобы границы окон совпадали в разных запросах. Для календарных месяцев используйте date_trunc(), потому что шаг date_bin не принимает интервалы в месяцах и крупнее.
Посчитать события по 15 минут
Если created_at имеет тип timestamptz, запрос соберёт количество событий по UTC-окнам и ограничит выборку полуоткрытым диапазоном:
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.