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
相关产品推荐
相关产品推荐

