You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:33:12