SQL查询:按DF取最小JobRank后筛选每个Job对应最小MF的实现问题
问题原因
你现有的代码只完成了第一步筛选逻辑:筛选每个DF对应最小JobRank的所有记录,没有处理第二步「同Job下仅保留最小MF记录」的要求,所以会返回MF=1、MF=2两条Job=1的重复数据,不符合输出要求。
解决方案
方案1:窗口函数实现(推荐,兼容MySQL8.0+、PostgreSQL、SQL Server等主流数据库,逻辑清晰性能优)
WITH ranked_data AS ( SELECT t2.MF, t2.DF, t2.Job, -- 按DF分组,标记同DF下JobRank最小的记录 RANK() OVER(PARTITION BY t2.DF ORDER BY t2.JobRank ASC) AS rk_jobrank, -- 按Job分组,标记同Job下MF最小的记录 RANK() OVER(PARTITION BY t2.Job ORDER BY t2.MF ASC) AS rk_mf FROM DfTable t1 INNER JOIN table2 t2 ON t1.DF = t2.DF ) SELECT MF, DF, Job FROM ranked_data WHERE rk_jobrank = 1 AND rk_mf = 1 ORDER BY MF ASC;
方案2:子查询+分组实现(兼容不支持窗口函数的低版本数据库,如MySQL5.x)
你可以在原有代码基础上增加分组取最小MF的逻辑即可:
SELECT MIN(t2.MF) AS MF, t1.DF, t2.Job FROM DfTable t1 INNER JOIN table2 t2 ON t1.DF = t2.DF WHERE t2.JobRank = ( SELECT MIN(JobRank) FROM table2 t3 WHERE t3.DF = t2.DF ) GROUP BY t1.DF, t2.Job ORDER BY MF ASC;
以上两种方案返回的结果都和你给出的期望输出完全一致,满足MF唯一、每个Job对应唯一DF的要求。
内容的提问来源于stack exchange,提问作者Ani
相关产品推荐
相关产品推荐

