You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;

逻辑解释:

  1. ROW_NUMBER() OVER (ORDER BY week_code):先按周排序,为每一行生成连续的行号(1、2、3、4、5、6...),这一步确保分组是基于你已排序的周数据。
  2. 减1:把行号转换成从0开始的序列(0、1、2、3、4、5...),这样前4行的数值范围是0-3,接下来4行是4-7,以此类推。
  3. 整数除法// 4:PostgreSQL中//是整数除法运算符,0-3除以4结果都是0,4-7除以4结果都是1,以此得到0、0、0、0、1、1、1、1...的分组基准值。
  4. 加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 10:18:08