Справочник по функциям

GENERATE_SERIES

Аналог в MySQL:

Генерирует ряд значений от start до stop с заданным шагом, по одной строке на значение.

PostgreSQL 17.5
GENERATE_SERIES(start, stop [, step])

Параметры

startinteger | numeric | timestamp
Первое значение ряда
stopinteger | numeric | timestamp
Граница ряда, входит в него, если на неё попадает шаг
stepinteger | numeric | intervalнеобязательный
Шаг ряда, по умолчанию 1; для дат обязателен и задаётся интервалом

Возвращаемое значение

Набор строк того же типа, что и start (для DATE — timestamp with time zone); пустой набор, если при положительном шаге start больше stop, а при отрицательном — меньше

Примеры

Числа с шагом 3

PostgreSQL 17.5
SELECT GENERATE_SERIES(1, 10, 3);
generate_series
1
4
7
10

Даты по дням

PostgreSQL 17.5
SELECT GENERATE_SERIES(
		DATE '2024-03-01',
		DATE '2024-03-05',
		INTERVAL '1 day'
	)::DATE AS DAY;
day
2024-03-01
2024-03-02
2024-03-03
2024-03-04
2024-03-05

Ряд во FROM как таблица

PostgreSQL 17.5
SELECT n,
	n * n AS square
FROM GENERATE_SERIES(1, 5) AS n;
nsquare
11
24
39
416
525

Платежи по месяцам, включая пустые

PostgreSQL 17.5
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;
monthpayments
2005-010
2005-023
2005-033
2005-041
2005-052
2005-066
2005-073
2005-081
2005-092
2005-102

Обратный отсчёт с отрицательным шагом

PostgreSQL 17.5
SELECT GENERATE_SERIES(10, 1, -3) AS countdown;
countdown
10
7
4
1

Подробности

Чаще всего функцию ставят во FROM как таблицу: FROM GENERATE_SERIES(1, 5) AS n. Так можно получить, например, все месяцы года и присоединить к ним данные через LEFT JOIN, чтобы увидеть месяцы без записей.

Шаг 0 вызывает ошибку. С отрицательным шагом ряд идёт по убыванию, поэтому start должен быть больше stop.

Смотрите также