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

MySQL按部门分组查询列最值时能否同步获取对应人员姓名

错误原因

  • 你尝试的SQL里子查询取的是全表的最大/最小值,不是每个部门对应的分组最值,筛选范围本身就不符合需求
  • GROUP BY 分组后,SELECT 子句仅支持输出分组字段、聚合运算结果字段,直接输出未聚合的Name字段不符合SQL语法规范,因此会报错

实现方案

需求完全可以实现,根据你使用的数据库版本可以选择以下两种写法:

方案1:窗口函数实现(推荐,适配MySQL 8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库)

WITH ranked_data AS (
    SELECT 
        Departement,
        Name,
        `Some Integer`, -- 字段名带空格请用对应数据库的标识符包裹,MySQL用反引号,PG/SQL Server用双引号
        RANK() OVER(PARTITION BY Departement ORDER BY `Some Integer` DESC) AS max_rank,
        RANK() OVER(PARTITION BY Departement ORDER BY `Some Integer` ASC) AS min_rank
    FROM 你的实际表名
)
SELECT 
    Departement,
    MAX(CASE WHEN max_rank = 1 THEN Name END) AS max_value_owner,
    MAX(CASE WHEN max_rank = 1 THEN `Some Integer` END) AS max_value,
    MAX(CASE WHEN min_rank = 1 THEN Name END) AS min_value_owner,
    MAX(CASE WHEN min_rank = 1 THEN `Some Integer` END) AS min_value
FROM ranked_data
WHERE max_rank = 1 OR min_rank = 1
GROUP BY Departement;

如果同一部门存在多个相同最值的人员,RANK()会返回所有符合条件的记录,若仅需要保留任意一条,将RANK()替换为ROW_NUMBER()即可。


方案2:关联子查询实现(兼容MySQL 5.x等不支持窗口函数的老版本数据库)

先分组算出每个部门的最值,再关联回原表匹配对应的人员姓名:

SELECT 
    base.Departement,
    t_max.Name AS max_value_owner,
    base.max_value,
    t_min.Name AS min_value_owner,
    base.min_value
FROM (
    SELECT 
        Departement,
        MAX(`Some Integer`) AS max_value,
        MIN(`Some Integer`) AS min_value
    FROM 你的实际表名
    GROUP BY Departement
) base
LEFT JOIN 你的实际表名 t_max 
    ON base.Departement = t_max.Departement AND base.max_value = t_max.`Some Integer`
LEFT JOIN 你的实际表名 t_min
    ON base.Departement = t_min.Departement AND base.min_value = t_min.`Some Integer`;

如果同一部门有多个相同最值的人员,该写法会返回多条对应记录,若仅需要一条,可在外层查询加上GROUP BY base.Departement去重。


内容的提问来源于stack exchange,提问作者AleksSpifu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:36:02