如何在PostgreSQL中生成每4行一组的连续分组编号(1、1、1、1、2、2、2、2...)
如何在PostgreSQL中生成每4行一组的连续分组编号(1、1、1、1、2、2、2、2...)
看起来你需要把按周排序的数据每4行归为一组,生成连续的分组编号对吧?你提到试过ROW_NUMBER(),其实只需要对它做一点简单的数学变换就能完美实现需求了。
核心思路是利用整数除法的特性,将连续的行号转换成每4行一组的编号。这里直接给你可以复用的SQL语句:
SELECT week_code, revenue, -- 核心分组计算逻辑 (ROW_NUMBER() OVER (ORDER BY week_code) - 1) // 4 + 1 AS grouping FROM your_table_name -- 替换成你的实际表名 ORDER BY week_code;
逻辑解释:
ROW_NUMBER() OVER (ORDER BY week_code):先按周排序,为每一行生成连续的行号(1、2、3、4、5、6...),这一步确保分组是基于你已排序的周数据。- 减1:把行号转换成从0开始的序列(0、1、2、3、4、5...),这样前4行的数值范围是0-3,接下来4行是4-7,以此类推。
- 整数除法
// 4:PostgreSQL中//是整数除法运算符,0-3除以4结果都是0,4-7除以4结果都是1,以此得到0、0、0、0、1、1、1、1...的分组基准值。 - 加1:把基准值从0起始转换成1起始的分组编号,最终得到1、1、1、1、2、2、2、2...的结果,完全匹配你想要的输出。
匹配你的示例验证:
- 第1-4行:行号1-4 → 减1得0-3 → 除以4得0 → 加1得1
- 第5-8行:行号5-8 → 减1得4-7 → 除以4得1 → 加1得2
- 以此类推,完全和你给出的期望分组结果一致。
如果你的week_code本身可以提取出连续的周数字(比如从FY23 W1里拿到1,FY23 W2拿到2),也可以用周数字直接计算:
SELECT week_code, revenue, (SUBSTRING(week_code FROM 'W(\d+)')::INT - 1) // 4 + 1 AS grouping FROM your_table_name ORDER BY week_code;
不过第一种用ROW_NUMBER()的方法更通用,不管week_code的格式如何,只要数据按周排序就能正常工作。
备注:内容来源于stack exchange,提问作者mattsteel
相关产品推荐
相关产品推荐

