Oracle SQL按ID分组实现No字段自定义起始排序实现咨询
Oracle SQL 分组内自定义起始点排序实现方案
实现思路
我们需要在每个Id分组内对No字段做循环移位排序:从指定的起始No开始升序排列,到分组最大No后,再从分组最小No升序排列到起始No的前一位。可以通过自定义排序权重实现:
- No ≥ 起始值时,权重为No本身
- No < 起始值时,权重为No + 当前Id分组的No最大值
按权重升序排序即可得到目标结果。
实现代码
动态参数通用写法(支持任意指定起始点)
使用分析函数预计算每个分组的最大No,性能更优,适合大数据量场景,:start_no为你指定的排序起始值,可动态传参:
WITH group_max_calc AS ( SELECT No, Id, MAX(No) OVER (PARTITION BY Id) AS group_max_no FROM 你的表名 ) SELECT No, Id FROM group_max_calc ORDER BY Id, -- 先按Id分组 CASE WHEN No >= :start_no THEN No ELSE No + group_max_no END ASC;
固定起始值简化写法
如果固定从No=2开始排序,可以直接写为:
SELECT No, Id FROM 你的表名 ORDER BY Id, CASE WHEN No >=2 THEN No ELSE No + (SELECT MAX(No) FROM 你的表名 t2 WHERE t2.Id = 你的表名.Id) END ASC;
效果验证
当传入:start_no=2时,输出结果和要求的完全一致:
| No | Id |
|---|---|
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 1 | 1 |
| 2 | 2 |
| 3 | 2 |
| 4 | 2 |
| 1 | 2 |
拓展说明
该方案无需提前假设No是连续值,即使同一个Id分组内No存在断层、重复的场景,也可以正常实现循环移位排序需求。如果需要保证重复No的排序稳定性,可以在ORDER BY的最后追加原有行号、插入时间等唯一字段作为辅助排序条件。
内容的提问来源于stack exchange,提问作者Adeel Aslam
相关产品推荐
相关产品推荐

