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

如何在MySQL中筛选每组严格唯一最大值所在行

解决方案

原表 tab1 结构与数据

idobjcol2val
1obj1item12
2obj2item25
3obj1item34
4obj2item15
5obj3item42
6obj3item21

期望输出

idobjcol2val
3obj1item34
5obj3item42

你之前写的SQL有两个问题:一是不符合SQL标准(非聚合字段id、col2未包含在GROUP BY中,不同数据库执行结果可能混乱);二是没过滤掉最大值重复的分组(比如obj2里val=5出现两次,不满足“严格大于同组其他所有值”的要求)。

下面给两种可行的正确写法:

方法一:用窗口函数(推荐,支持MySQL8+、PostgreSQL、SQL Server等)

SELECT id, obj, col2, val
FROM (
    SELECT 
        *,
        -- 给每个obj分组按val降序排名,最大值行排第1
        RANK() OVER (PARTITION BY obj ORDER BY val DESC) AS rnk,
        -- 统计每个obj分组内相同val的行数
        COUNT(*) OVER (PARTITION BY obj, val) AS val_count
    FROM tab1
) t
-- 只取排名第1且该val在组内仅出现一次的行
WHERE rnk = 1 AND val_count = 1;

方法二:用分组子查询(兼容低版本数据库)

SELECT t1.*
FROM tab1 t1
JOIN (
    SELECT obj, MAX(val) AS max_val
    FROM tab1
    GROUP BY obj
    -- 确保组内只有一行等于最大值(即最大值唯一)
    HAVING COUNT(*) = COUNT(CASE WHEN val = MAX(val) THEN 1 END)
) t2 ON t1.obj = t2.obj AND t1.val = t2.max_val;

内容的提问来源于stack exchange,提问作者Harikesh Pratap Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:15:40