跳转到内容

生成一个从指定起点开始、到另一指定终点结束的数据集,并可选择按递增值生成。GENERATE_SERIES 函数适用于以下数据类型:

  • 整数
  • 日期
  • 时间戳
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>])
参数 说明
start 起始值,即序列中的第一个数字、日期或时间戳。
stop 结束值,即序列中的最后一个数字、日期或时间戳。
step_interval 步长,决定序列中相邻值之间的差值。对于整数序列,默认值为 1。对于日期序列,默认步长为 1 天。对于时间戳序列,默认步长为 1 微秒。

返回一个列表,其中包含从 start 到 stop 的连续数值、日期或时间戳序列。

SQL 示例 1:生成数值、日期和时间戳数据

Section titled “SQL 示例 1:生成数值、日期和时间戳数据”
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|

SQL 示例 2:填补查询结果中的空缺

Section titled “SQL 示例 2:填补查询结果中的空缺”

此示例使用 GENERATE_SERIES 函数和左联接运算符,处理因特定范围内缺少信息而导致的查询结果空缺。

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|

要填补 2020 年 1 月 1 日至 1 月 10 日之间的空缺,请使用以下查询:

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|