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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:54:02