GENERATE_SERIES
Аналог в MySQL:
Генерирует ряд значений от start до stop с заданным шагом, по одной строке на значение.
PostgreSQL 17.9
GENERATE_SERIES(start, stop [, step])- [ ]необязательная часть
- start
- Первое значение рядаinteger | numeric | timestamp
- stop
- Граница ряда, входит в него, если на неё попадает шагinteger | numeric | timestamp
- step
- Шаг ряда, по умолчанию 1; для дат обязателен и задаётся интерваломinteger | numeric | intervalНеобязательный
Возвращаемое значение
Набор строк того же типа, что и start (для DATE — timestamp with time zone); пустой набор, если при положительном шаге start больше stop, а при отрицательном — меньше
Примеры
Числа с шагом 3
PostgreSQL 17.9
SELECT GENERATE_SERIES(1, 10, 3);Даты по дням
PostgreSQL 17.9
SELECT GENERATE_SERIES(
DATE '2024-03-01',
DATE '2024-03-05',
INTERVAL '1 day'
)::DATE AS DAY;Ряд во FROM как таблица
PostgreSQL 17.9
SELECT n,
n * n AS square
FROM GENERATE_SERIES(1, 5) AS n;Платежи по месяцам, включая пустые
PostgreSQL 17.9
SELECT TO_CHAR(m, 'YYYY-MM') AS MONTH,
COUNT(p.payment_id) AS payments
FROM GENERATE_SERIES(
DATE '2005-01-01',
DATE '2005-12-01',
INTERVAL '1 month'
) AS m
LEFT JOIN Payments AS p ON DATE_TRUNC('month', p.date) = m
GROUP BY m
ORDER BY m;Обратный отсчёт с отрицательным шагом
PostgreSQL 17.9
SELECT GENERATE_SERIES(10, 1, -3) AS countdown;Подробности
Чаще всего функцию ставят во FROM как таблицу: FROM GENERATE_SERIES(1, 5) AS n. Так можно получить, например, все месяцы года и присоединить к ним данные через LEFT JOIN, чтобы увидеть месяцы без записей.
Шаг 0 вызывает ошибку. С отрицательным шагом ряд идёт по убыванию, поэтому start должен быть больше stop.