Oracle按分组字段实现组内记录编号的技术问题
按分组字段实现组内连续编号的SQL解决方案
你当前使用的SQL仅能生成全局连续的rownum,无法实现按field_1+field_2组合的组内编号:
select rownum, field_1, field_2, field_2 from table1 where field_1 = 726200783 group by rownum, field_1, field_2, field_2 order by field_1, field_2, field_2, rownum
执行后得到的全局编号结果:
ROWNUM field_1 field_2 field_3 4 726200783 C 236332639 1 726200783 C 236361290 2 726200783 N 235814367 3 726200783 P 235843569
你期望的是按field_1与field_2的组合做组内编号,结果如下:
ROWNUM field_1 field_2 field_3 1 726200783 C 236361290 2 726200783 C 236332639 1 726200783 N 235814367 1 726200783 P 235843569
正确实现方式
使用ROW_NUMBER()窗口函数,通过PARTITION BY指定分组字段,ORDER BY控制组内的编号顺序:
SELECT ROW_NUMBER() OVER (PARTITION BY field_1, field_2 ORDER BY field_3) AS rownum, field_1, field_2, field_3 FROM table1 WHERE field_1 = 726200783 ORDER BY field_1, field_2, rownum;
说明
PARTITION BY field_1, field_2:指定按这两个字段的组合进行分组,每组单独编号ORDER BY field_3:控制组内的编号顺序(可根据需求替换为其他字段,如时间戳等)- 无需额外的
GROUP BY,窗口函数已完成分组编号逻辑
如果需要筛选组内特定行(比如rownum = 1),可以将上述查询作为子查询:
SELECT * FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY field_1, field_2 ORDER BY field_3) AS rownum, field_1, field_2, field_3 FROM table1 WHERE field_1 = 726200783 ) t WHERE t.rownum = 1;
内容的提问来源于stack exchange,提问作者user15676
相关产品推荐
相关产品推荐

