Oracle查询:去重并保留每条Name对应最大CODESCHOOL的记录
解决Oracle中保留每个Name对应CODESCHOOL最大值记录的问题
我明白你遇到的问题了——单纯用MAX(CODESCHOOL)分组查询只能拿到每个Name的最大值,但没法关联回对应的ID和SCHOOLNAME字段对吧?下面给你两种可靠的Oracle查询方案,都能得到你想要的结果:
方法一:使用窗口函数ROW_NUMBER()(推荐)
窗口函数是处理这类“分组取Top N”场景最直观的方式,它能给每个分组内的记录排序,然后我们只取排序后的第一条(也就是CODESCHOOL最大的那条):
SELECT ID, Name, SCHOOLNAME, CODESCHOOL FROM ( SELECT ID, Name, SCHOOLNAME, CODESCHOOL, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY CODESCHOOL DESC) AS rn FROM your_table_name -- 替换成你的实际表名 ) t WHERE rn = 1;
代码解释:
PARTITION BY Name:按Name字段分组,把相同Name的记录归为一组ORDER BY CODESCHOOL DESC:在每个分组内,按CODESCHOOL从大到小排序ROW_NUMBER():给每个分组内的记录分配行号,最大的CODESCHOOL会拿到行号1- 外层查询筛选出行号为1的记录,就是每个Name对应CODESCHOOL最大的完整记录
如果存在同一个Name有多个相同的最大CODESCHOOL值的情况,ROW_NUMBER()会随机选一条;如果想保留所有最大值的记录,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK()。
方法二:使用关联子查询
如果你习惯用子查询的方式,也可以通过关联每个Name的最大CODESCHOOL值来筛选记录:
SELECT t1.ID, t1.Name, t1.SCHOOLNAME, t1.CODESCHOOL FROM your_table_name t1 WHERE t1.CODESCHOOL = ( SELECT MAX(CODESCHOOL) FROM your_table_name t2 WHERE t2.Name = t1.Name );
代码解释:
- 子查询会找出当前Name对应的最大CODESCHOOL值
- 外层查询筛选出CODESCHOOL等于这个最大值的记录
- 注意:如果同一个Name有多个记录的CODESCHOOL等于最大值,这个查询会返回所有这些记录,和
RANK()的效果一致
验证结果
用你给出的测试数据,两种方法都会返回你期望的结果:
ID | Name | SCHOOLNAME | CODESCHOOL
1 | DARK | Kindergarten | 123
3 | Knight | NY University | 3
5 | JOHN | HARVARD | 3
内容的提问来源于stack exchange,提问作者Muhammad Bima Pramadinata
相关产品推荐
相关产品推荐

