MAX函数与GROUP BY子句一起使用

jor*_*oro 2 mysql sql select group-by aggregate-functions

我有名字,工资和员工部门的数据库.我需要一个查询来获得每个部门薪水最高的员工.

数据库:

create table test(
    employee_name VARCHAR(255),
    department VARCHAR(255),
    salary INT  
);
Run Code Online (Sandbox Code Playgroud)

数据:

INSERT INTO test(employee_name, department, salary) VALUES 
("John", "DepartmentA", 1500),
("Sarah","DepartmentA", 1600),
("Romel","DepartmentA", 1400),
("Victoria","DepartmentB", 1400),
("Maria",   "DepartmentB", 1600);
Run Code Online (Sandbox Code Playgroud)

我的尝试:

1.1 WHERE MAX(薪水)=工资GROUP BY部门

SELECT employee_name, salary FROM test WHERE MAX(salary) = salary GROUP BY department;
ERROR 1111 (HY000): Invalid use of group function
Run Code Online (Sandbox Code Playgroud)

1.2.当我用硬编码值替换MAX(薪水)时,它按预期工作:

SELECT employee_name, salary FROM test WHERE 1600 = salary GROUP BY department;
+---------------+--------+
| employee_name | salary |
+---------------+--------+
| Sarah         |   1600 |
| Maria         |   1600 |
+---------------+--------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
  1. 有条款的错误答案(单个结果,不是每个部门):

    SELECT employee_name,salary FROM test GROUP BY department HAVING MAX(薪水)=工资;

    + --------------- + -------- + | employee_name | 工资| + --------------- + -------- + | 玛丽亚| 1600 | + --------------- + -------- + 1行(0.00秒)

我期望的结果是:

Sarah, DepartmentA
Maria, DepartmentB
Run Code Online (Sandbox Code Playgroud)

fth*_*lla 5

首先,您必须获得每个部门的最高薪水:

SELECT department, max(salary) as max_salary
FROM test
GROUP BY department
Run Code Online (Sandbox Code Playgroud)

然后你可以将这个子查询加入到测试表中:

SELECT t.*
FROM
  test t INNER JOIN (
    SELECT department, max(salary) as max_salary
    FROM test
    GROUP BY department
  ) d ON t.department=d.department AND t.salary=d.max_salary
Run Code Online (Sandbox Code Playgroud)