Масиви й серіїлише PostgreSQL

GENERATE_SERIES

Створює рядки з послідовністю чисел або моментів часу.

Синтаксис

GENERATE_SERIES(<початок>, <кінець>)
GENERATE_SERIES(<початок>, <кінець>, <крок>)

Генерує рядки від початку до кінця включно з заданим кроком: числа 1, 2, 3… чи дати день за днем. Таблиця для цього не потрібна. Найчастіше — щоб отримати повний календар і показати у звіті навіть ті дні чи місяці, коли нічого не сталося.

Дані для прикладів

orders

idcreated_atamount
12026-07-03 10:15:00120.50
22026-07-28 18:40:0080.25
32026-08-09 09:05:00199.99
42026-08-21 14:30:0045.00
52026-09-02 11:00:0064.75

Ці таблиці вже створено в пісочниці — приклади нижче працюють із ними. Хочеш повторити у своїй базі — скопіюй SQL.

Числа від 1 до 5
SELECT GENERATE_SERIES(1, 5) AS n;
n
1
2
3
4
5
З кроком
SELECT GENERATE_SERIES(0, 100, 25) AS percent;
percent
0
25
50
75
100
Кожен день тижня
SELECT day::date AS day
FROM GENERATE_SERIES(TIMESTAMP '2026-09-07', TIMESTAMP '2026-09-13', INTERVAL '1 day') AS day;
day
2026-09-07
2026-09-08
2026-09-09
2026-09-10
2026-09-11
2026-09-12
2026-09-13
Замовлення по місяцях — разом із порожнімиСкладніше
SELECT month_start::date AS month,
COUNT(o.id) AS order_count
FROM GENERATE_SERIES(TIMESTAMP '2026-06-01', TIMESTAMP '2026-09-01', INTERVAL '1 month') AS month_start
LEFT JOIN orders o ON DATE_TRUNC('month', o.created_at) = month_start
GROUP BY month_start
ORDER BY month_start;
monthorder_count
2026-06-010
2026-07-012
2026-08-012
2026-09-011

У червні замовлень не було, але місяць у звіті є: LEFT JOIN його лишає, а COUNT(o.id) дає 0.

Зверни увагу

Кінець входить у результат: GENERATE_SERIES(1, 5) дає 5 рядків.

Якщо початок більший за кінець, а крок додатний, рядків не буде зовсім. Відлік назад — з від'ємним кроком: GENERATE_SERIES(5, 1, -1).

Для дат крок-інтервал обов'язковий. А якщо передати тип DATE, результат стане timestamp with time zone і залежатиме від часового поясу — тому в прикладах TIMESTAMP і ::date.

Схожі функції