如何在PostgreSQL中重复生成n次row_number()序号?
在PostgreSQL中实现行号分组重复(每n行复用一个递增整数)
我们已经可以通过row_number()生成连续递增的行号,现在需要实现每n行(示例中n=5)重复一个递增的分组编号,即前5行的rownum_repeat为1,后续行依次归为2、3...,最终得到如下格式的输出:
| id | text | rownum | rownum_repeat |
|---|---|---|---|
| 1 | "val1" | 1 | 1 |
| 2 | "val2" | 2 | 1 |
| 3 | "val3" | 3 | 1 |
| 4 | "val4" | 4 | 1 |
| 5 | "val5" | 5 | 1 |
| 6 | "val6" | 6 | 2 |
| 7 | "val7" | 7 | 2 |
解决方案
核心逻辑是对row_number()生成的行号进行分组计算,这里提供两种常用实现方式:
方式1:使用CEIL()函数(浮点数除法)
通过将行号转为浮点数后除以分组大小n,再用CEIL()向上取整,即可得到分组编号:
SELECT id, text, ROW_NUMBER() OVER () AS rownum, CEIL(ROW_NUMBER() OVER ()::FLOAT / 5) AS rownum_repeat FROM public.examples;
方式2:整数运算(避免浮点数)
如果希望用纯整数运算实现,可以通过(行号 + n - 1) // n的公式自动完成向上取整,效果与方式1完全一致:
SELECT id, text, ROW_NUMBER() OVER () AS rownum, (ROW_NUMBER() OVER () + 5 - 1) // 5 AS rownum_repeat FROM public.examples;
两种方法都能精准实现需求,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者iskandarblue
相关产品推荐
相关产品推荐

