Ir al contenido

Genera un conjunto de datos que comienza en un punto especificado, termina en otro punto especificado y, opcionalmente, avanza con un valor de incremento. La función GENERATE_SERIES funciona con los siguientes tipos de datos:

  • Entero
  • Fecha
  • Marca de tiempo
func.generate_series(<start>, <stop>[, <step_interval>])
func.generate_series(1, 10, 2);
generate_series|
---------------+
1|
3|
5|
7|
9|
GENERATE_SERIES(<start>, <stop>[, <step_interval>])
Argumento Descripción
start El valor inicial, que representa el primer número, fecha o marca de tiempo de la secuencia.
stop El valor final, que representa el último número, fecha o marca de tiempo de la secuencia.
step_interval El intervalo de paso, que determina la diferencia entre valores adyacentes de la secuencia. En las secuencias de enteros, el valor predeterminado es 1. En las secuencias de fechas, el intervalo de paso predeterminado es 1 día. En las secuencias de marcas de tiempo, el intervalo de paso predeterminado es 1 microsegundo.

Devuelve una lista que contiene una secuencia continua de valores numéricos, fechas o marcas de tiempo desde start hasta stop.

Ejemplos de SQL 1: generación de datos numéricos, de fecha y de marca de tiempo

Sección titulada «Ejemplos de SQL 1: generación de datos numéricos, de fecha y de marca de tiempo»
SELECT * FROM GENERATE_SERIES(1, 10, 2);
generate_series|
---------------+
1|
3|
5|
7|
9|
SELECT * FROM GENERATE_SERIES('2023-03-20'::date, '2023-03-27'::date);
generate_series|
---------------+
2023-03-20|
2023-03-21|
2023-03-22|
2023-03-23|
2023-03-24|
2023-03-25|
2023-03-26|
2023-03-27|
SELECT * FROM GENERATE_SERIES('2023-03-26 00:00'::timestamp, '2023-03-27 12:00'::timestamp, 86400000000);
generate_series |
-------------------+
2023-03-26 00:00:00|
2023-03-27 00:00:00|

Ejemplos de SQL 2: relleno de huecos en los resultados de una consulta

Sección titulada «Ejemplos de SQL 2: relleno de huecos en los resultados de una consulta»

Este ejemplo usa la función GENERATE_SERIES y el operador de combinación izquierda para tratar los huecos en los resultados de una consulta causados por la falta de información en intervalos específicos.

CREATE TABLE t_metrics (
date Date,
value INT
);
INSERT INTO t_metrics VALUES
('2020-01-01', 200),
('2020-01-01', 300),
('2020-01-04', 300),
('2020-01-04', 300),
('2020-01-05', 400),
('2020-01-10', 700);
SELECT date, SUM(value), COUNT() FROM t_metrics GROUP BY date ORDER BY date;
date |sum(value)|count()|
----------+----------+-------+
2020-01-01| 500| 2|
2020-01-04| 600| 2|
2020-01-05| 400| 1|
2020-01-10| 700| 1|

Para cerrar los huecos entre el 1 y el 10 de enero de 2020, use la siguiente consulta:

SELECT t.date, COALESCE(SUM(t_metrics.value), 0), COUNT(t_metrics.value)
FROM generate_series(
'2020-01-01'::Date,
'2020-01-10'::Date
) AS t(date)
LEFT JOIN t_metrics ON t_metrics.date = t.date
GROUP BY t.date ORDER BY t.date;
date |coalesce(sum(t_metrics.value), 0)|count(t_metrics.value)|
----------+---------------------------------+----------------------+
2020-01-01| 500| 2|
2020-01-02| 0| 0|
2020-01-03| 0| 0|
2020-01-04| 600| 2|
2020-01-05| 400| 1|
2020-01-06| 0| 0|
2020-01-07| 0| 0|
2020-01-08| 0| 0|
2020-01-09| 0| 0|
2020-01-10| 700| 1|