如何在PostgreSQL中为用户表生成全等级序列行
PostgreSQL生成用户等级序列行的解决方案
针对你的需求,不需要使用窗口函数,PostgreSQL的generate_series函数配合表连接就能轻松实现行展开,以下是两种实用方法:
方法一:隐式交叉连接(简洁写法)
假设你的原表名为user_levels,执行以下SQL即可得到目标结果:
SELECT ul.user_id, generate_series(1, ul.current_level) AS current_level FROM user_levels ul ORDER BY ul.user_id, current_level;
原理说明
generate_series(1, ul.current_level)会为每个用户生成从1到其current_level的整数序列,原表的每一行会和这个序列的每个值进行关联,从而将单条记录展开为多行等级数据。
方法二:LATERAL连接(更清晰的逻辑表达)
如果需要更明确的关联逻辑,也可以使用LATERAL子查询:
SELECT ul.user_id, lv.level AS current_level FROM user_levels ul LATERAL ( SELECT generate_series(1, ul.current_level) AS level ) lv ORDER BY ul.user_id, lv.level;
原理说明
LATERAL关键字允许子查询引用外部表(这里是user_levels)的列,子查询为每个用户单独生成对应的等级序列,再和原表行关联展开。
这两种方法都能精准生成你需要的结果,比如原表中user_id=3、current_level=4的记录,会被展开为4行,等级分别为1、2、3、4,完全匹配目标结构。
内容的提问来源于stack exchange,提问作者Daniel G
相关产品推荐
相关产品推荐

