news 2026/10/8 18:24:56

PostgreSQL generate_series 数字序列生成:语法、步进控制与实战扩展(til 笔记)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PostgreSQL generate_series 数字序列生成:语法、步进控制与实战扩展(til 笔记)
  • 文档
  • 教程
  • 知识库

【免费下载链接】til

:memo: Today I Learned

项目地址:https://gitcode.com/gh_mirrors/ti/til
点击查看免费下载

generate_series是 PostgreSQL 内置的集合返回函数(set-returning function),核心用途是按规则"生成一串东西"——既可以是连续的整数,也可以是带有自定义步进的等差数列。本文以 til 仓库中 generate-series-of-numbers.md 为主线,完整讲解start、stop、step三参数的用法,并结合仓库内其他 PostgreSQL 笔记(批量造数、列聚合、函数重载列表)给出可直接复用的实战扩展。

基础用法:只传 start 和 stop

generate_series最简单的调用方式是只提供两个参数:起始值start和结束值stop。它会从start开始,以默认步进1逐个生成,直到超过stop为止:

> select generate_series(1,5); generate_series ----------------- 1 2 3 4 5

得到的是一个 5 行的结果集,每行一个整数。这个最简单的形态就是后续所有复杂场景的基石。

反向计数:指定负步进

默认步进是1,所以如果想倒着数,就必须显式传入第三个参数——一个负的步进值。例如generate_series(5,1,-1)会从 5 递减到 1:

> select generate_series(5,1,-1); generate_series ----------------- 5 4 3 2 1

注意:当start > stop且步进为正时不会产生任何行;反向序列必须配合负步进使用。

自定义步进:生成倍数列

步进参数不仅可以取负值,还可以取任意大于 1 的整数值。比如想只取 3 的倍数,可以用generate_series(3,17,3),从 3 开始每次加 3,直到超过上限 17:

> select generate_series(3,17,3); generate_series ----------------- 3 6 9 12 15

这里最后一个生成值 15 小于 17,是因为 18 已经超出stop边界,体现了"不超过 stop 即停止"的规则。同理,generate_series(1,10,3)只会得到 1、4、7、10。

函数的全部重载版本

generate_series并非只有一个签名,它针对不同数据类型提供了多个重载版本。在 psql 中可以用\df查看,仓库笔记 list-all-versions-of-a-function.md 中记录了\df generate_series的完整输出,可以概括为 6 个版本:

参数类型返回类型
bigint, bigintSETOF bigint
bigint, bigint, bigintSETOF bigint
integer, integerSETOF integer
integer, integer, integerSETOF integer
timestamp with time zone, timestamp with time zone, intervalSETOF timestamp with time zone
timestamp without time zone, timestamp without time zone, intervalSETOF timestamp without time zone

前四个版本对应本文演示的整数序列;最后两个版本接受时间戳加interval步进,正是原文档末尾"用时间戳试试"留给读者的练习方向——调用形如generate_series('2024-01-01', '2024-01-05', interval '1 day'),此时第三个参数必须是interval类型而不能是整数。

实战扩展:在 FROM 子句中生成行

generate_series最常见的进阶用法是出现在FROM子句里,当作一张"虚拟表"使用,并为列起别名。仓库笔记 aggregate-a-column-into-an-array.md 演示了这种写法:

> select num from generate_series(1,5) as num; num ----- 1 2 3 4 5

between-symmetric.md 中则用了带列名的别名形式from generate_series(1,10) as numbers(a),可以直接引用a列参与后续计算。这种"序列即行集"的思维,让generate_series成为数据生成和数值计算的通用底座。

实战扩展:批量造数插入表

生成序列最实用的场景之一,是用INSERT ... SELECT快速插入海量测试数据。仓库笔记 insert-a-bunch-of-records-with-generate-series.md 提供了一个真实案例:向roles表一次性插入 54000 行,用于压测查询性能:

> insert into roles ( name, resource_id, resource_type, created_at, updated_at ) select 'organization_user', g.id, 'Organization', now(), now() from generate_series(1,54000) as g(id);

核心思路是:generate_series(1,54000)在FROM中产出 54000 个递增 id,SELECT再混合静态值(如固定的name、resource_type)与动态时间戳,拼出足够真实的假数据写回表里。调整左右边界即可控制行数,是填充种子数据、复现性能问题的常用手法。

小结

  • 两参数形式generate_series(start, stop)生成步进为 1 的递增整数序列;
  • 反向计数必须显式传负步进,如generate_series(5,1,-1);
  • 三参数形式可生成任意等差序列,如generate_series(3,17,3);
  • 整数与时间戳各有独立重载版本,时间戳版本要求第三个参数为interval;
  • 在FROM子句中结合列别名使用,可衔接INSERT、array_agg等场景完成批量造数与聚合分析。

相关仓库笔记可继续阅读:insert-a-bunch-of-records-with-generate-series.md、aggregate-a-column-into-an-array.md、list-all-versions-of-a-function.md、between-symmetric.md。

  • 文档
  • 教程
  • 知识库

【免费下载链接】til

:memo: Today I Learned

项目地址:https://gitcode.com/gh_mirrors/ti/til
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 18:23:50

剪映专业访谈字幕区分说话人:先回听身份,再统一姓名与样式

远程专业访谈需要区分主持与嘉宾,可以先识别字幕,再根据原声和可靠访谈记录逐句核说话人,最后统一姓名标签和样式。识别出文字,不等于自动认对人物身份;在交叠、短回应和离镜发言处,尤其不能只凭画面猜。剪…

作者头像 李华
网站建设 2026/10/8 18:23:24

儿童英语自主阅读怎么起步?先把词汇底子摸清

想让孩子自主阅读英语,很多家长直接丢一本分级读物过去,孩子却读两页就卡住、失去耐心。问题往往不在「孩子不努力」,而在「词汇底子没摸清」——孩子连自己认识哪些词、哪些词只是眼熟都不清楚,读起来自然处处是坑。自主阅读的起…

作者头像 李华
网站建设 2026/10/8 18:23:23

企业AI智能体落地的3个核心前提

1. 引言 不少企业上线 AI 智能体后常遇到三类问题:问答结果脱离企业实际、业务流程跑不通、全场景铺开后没人用。本质是跳过了三个核心前置准备,错把智能体等同于普通大模型对话机器人。 2. 前提一:知识库搭建 很多团队一开始就批量灌入内部文…

作者头像 李华
网站建设 2026/10/8 18:23:23

防爆对讲机深度技术解析:本质安全原理、电路架构、寒地工程落地与选型指南

防爆对讲机深度技术解析:本质安全原理、电路架构、寒地工程落地与选型指南 引言 石油炼化、成品油储罐区、精细化工、井下采掘、粮油深加工等场所内,可燃气体、蒸汽或可燃性粉尘会在空间积聚。微小的放电火花、元器件局部温升,都有可能触发爆…

作者头像 李华