Referencia de funciones

GENERATE_SERIES

Equivalente en MySQL:

Genera una serie de valores de start a stop con el paso indicado, una fila por valor.

PostgreSQL 17.9
GENERATE_SERIES(start, stop [, step])
  • [ ]parte opcional
start
Primer valor de la serie
integer | numeric | timestamp
stop
Límite de la serie; se incluye si el paso llega a él
integer | numeric | timestamp
step
Paso, 1 por defecto; con fechas es obligatorio y se indica como intervalo
integer | numeric | intervalOpcional

Valor devuelto

Conjunto de filas del tipo de start (con DATE, timestamp with time zone); conjunto vacío si start es mayor que stop con paso positivo o menor con paso negativo

Ejemplos

Números con paso 3

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

Fechas día a día

PostgreSQL 17.9
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

La serie en FROM como una tabla

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

Pagos por meses, también los vacíos

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

Cuenta atrás con paso negativo

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

Detalles

Normalmente la función se pone en FROM como una tabla: FROM GENERATE_SERIES(1, 5) AS n. Así puedes, por ejemplo, generar todos los meses de un año y unirles los datos con LEFT JOIN para ver los meses sin registros.

Un paso de 0 provoca un error. Con un paso negativo la serie va hacia abajo, y start tiene que ser mayor que stop.

Véase también