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 serieinteger | numeric | timestamp
- stop
- Límite de la serie; se incluye si el paso llega a élinteger | numeric | timestamp
- step
- Paso, 1 por defecto; con fechas es obligatorio y se indica como intervalointeger | 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);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;La serie en FROM como una tabla
PostgreSQL 17.9
SELECT n,
n * n AS square
FROM GENERATE_SERIES(1, 5) AS n;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;Cuenta atrás con paso negativo
PostgreSQL 17.9
SELECT GENERATE_SERIES(10, 1, -3) AS countdown;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.