Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
+----+-------+--------+--------------+| Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 || 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 || 4 | Max | 90000 | 1 | +----+-------+--------+--------------+
Department 表包含公司所有部门的信息。
+----+----------+| Id | Name | +----+----------+ | 1 | IT || 2 | Sales | +----+----------+
编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。
+------------+----------+--------+| Department | Employee | Salary |+------------+----------+--------+| IT | Max | 90000 || Sales | Henry | 80000 |+------------+----------+--------+
Solution 1 :
SELECT b. NAME AS department, a. NAME AS employee, a.salary FROM employee a JOIN department b ON a.departmentId = b.id WHERE (a.salary, a.departmentId) IN ( SELECT max(salary), departmentId FROM employee GROUP BY departmentId )
该解法,通过分组后,max(salary) 获取最大salary, 最后 通过 salary,departmentId 确定 部门里工资最高的员工。
**Solution 2 **
SELECT b.`name` AS department, a.`name` AS Employee, a.salary FROM ( SELECT NAME, salary, departmentId FROM employee ORDER BY salary DESC ) a LEFT JOIN department b ON a.departmentId = b.id GROUP BY departmentId;
该解法
order by salary desc 作排序,作为临时表
巧妙的利用group by 分组 获取该分组 工资最高的员工
思考:
如果IT 部门,最高工资90000,有两名同事,这两种解法 如何呢?有什么差异
作者:lconcise
链接:https://www.jianshu.com/p/c564fdba499e