Oracle SQL 按SR_NO分组取LINE_NO最大值对应整行记录方案
Oracle按分组取每组最大值对应完整记录实现方案
现有表信息
表名:DOA_MAINT,存量数据如下:
| SR_NO | ITEM | LINE_NO | TYPE |
|---|---|---|---|
| 100 | A10 | 1 | 98 |
| 100 | A10 | 2 | 94 |
| 200 | A20 | 1 | 77 |
| 200 | A20 | 2 | 98 |
| 200 | A20 | 3 | 56 |
需求目标
对表中数据按SR_NO字段分组,返回每个分组内LINE_NO字段最大值对应的完整单条记录,期望结果如下:
| SR_NO | ITEM | LINE_NO | TYPE |
|---|---|---|---|
| 100 | A10 | 2 | 94 |
| 200 | A20 | 3 | 56 |
实现代码
方案1:窗口函数实现(推荐,性能更优)
SELECT SR_NO, ITEM, LINE_NO, TYPE FROM ( SELECT SR_NO, ITEM, LINE_NO, TYPE, ROW_NUMBER() OVER(PARTITION BY SR_NO ORDER BY LINE_NO DESC) AS group_rn FROM DOA_MAINT ) t WHERE group_rn = 1;
逻辑说明
- 内层查询通过
ROW_NUMBER()窗口函数,以SR_NO为分组维度,每组内按LINE_NO倒序排序,为每行生成组内唯一序号 - 外层筛选序号为1的记录,即为每个
SR_NO分组下LINE_NO最大的对应记录
若同一
SR_NO下存在多条LINE_NO相同的最大值记录需要全部返回,可将ROW_NUMBER()替换为RANK()即可。
方案2:子查询关联实现
SELECT a.* FROM DOA_MAINT a INNER JOIN ( SELECT SR_NO, MAX(LINE_NO) AS MAX_LINE_NO FROM DOA_MAINT GROUP BY SR_NO ) b ON a.SR_NO = b.SR_NO AND a.LINE_NO = b.MAX_LINE_NO;
内容的提问来源于stack exchange,提问作者Imran Hemani
相关产品推荐
相关产品推荐

