Oracle如何从子查询结果中选取列值最大的行,处理多主体同最大值场景
解决方案
你可以通过三层嵌套子查询实现需求,逻辑简单好理解,完全符合你仅用子查询、不改表结构的要求,同时支持多个员工并列最高工作量的场景:
SELECT E.employee_name, t.job_done FROM Employees E, -- 子查询1:统计每个员工的总完成工作量 (SELECT Id, COUNT(*) job_done FROM Jobs GROUP BY Id) t, -- 子查询2:计算所有员工里的最高工作量数值 (SELECT MAX(job_count) max_job FROM (SELECT COUNT(*) job_count FROM Jobs GROUP BY Id)) max_t WHERE E.Id = t.Id -- 关联员工表和工作量统计结果 AND t.job_done = max_t.max_job; -- 过滤出工作量等于最高值的所有员工
逻辑说明
- 最内层的子查询先按员工Id分组统计所有员工的个人工作量
- 第二层子查询取所有员工工作量的最大值,作为匹配阈值
- 最外层关联员工表和工作量统计结果,只要工作量等于最大值的记录都会被返回,不管有多少个并列第一都不会遗漏
之前查询的问题说明
- 查询1的外层多余做了按员工姓名分组的操作,相当于重复输出了子查询已经算好的每个员工的工作量,自然得不到全局最高的结果
- 查询2用
fetch first row only仅能返回排序后的第一条记录,如果有多个员工工作量同为最高,只会返回第一个匹配到的员工,会遗漏数据
内容的提问来源于stack exchange,提问作者user17472621
相关产品推荐
相关产品推荐

