PostgreSQL generate_series: заполнить пропуски в датах

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

generate_series создаёт непрерывный календарный ряд, который можно соединить с агрегатами таблицы. Так отчёт показывает дни без событий с нулём вместо того, чтобы пропускать их. Это удобно для графиков и ежедневных сводок. Сверяйте календарные границы и часовой пояс с требованиями отчёта.

Рабочий пример

SQL
WITH calendar AS (
  SELECT day::date AS day
  FROM generate_series(
    date '2026-10-01', date '2026-10-07', interval '1 day'
  ) AS day
), sales(day, amount) AS (
  VALUES (date '2026-10-01', 12), (date '2026-10-04', 7)
)
SELECT calendar.day, COALESCE(sum(sales.amount), 0) AS total
FROM calendar
LEFT JOIN sales USING (day)
GROUP BY calendar.day
ORDER BY calendar.day;

LEFT JOIN сохраняет календарные даты без продаж, а COALESCE превращает NULL в 0. Группировка нужна, если в источнике несколько событий на один день.

Частый вопрос

Как построить календарь по месяцам?

Передайте generate_series границы с interval '1 month' и приведите результат к date или началу месяца. Для отчёта по неделям используйте подходящий интервал и согласованную бизнес-зону.