力扣184题 & 力扣185题
【题目】
184、部门工资最高的员工信息,name ,salary ,department_name
185、部门工资前三高的员工
表emplyee:
id | name | salary | departmentid |
1 | joe | 7000 | 1 |
2 | jim | 8500 | 1 |
3 | henry | 8000 | 2 |
4 | sam | 6000 | 2 |
5 | max | 9000 | 1 |
6 | randy | 8500 | 1 |
7 | zhangsan | 8000 | 1 |
表department
id | name |
1 | IT |
2 | sales |
【184题 解题思路】:部门工资最高的员工
1、部门工资最高;(分部门求最高值)按部门来划分,求每个部门中最高的薪水的员工信息,这其实就是分组,吧一个部门看成一个组。所以group by 部门;
SELECT
departmentid,
max( salary )
FROM
emplyee
GROUP BY
departmentid;
这其实就是每个部门的最高薪水
2、求部门工资最高的员工信息;也就是查每个部门的每个员工的薪水在上面这条sql语句执行的结果中的。
比如:我it部门 薪水9000,那就说明我的薪水在这条sql执行的结果中的。子查询其实就是;部门+薪水 in (上面的sql语句);
so,最后的sql语句
SELECT
e.`name`,
e.salary,
d.`name`
FROM
emplyee AS e
LEFT JOIN department AS d ON e.departmentid = d.id
WHERE
( departmentid, salary ) IN ( SELECT departmentid, max( salary ) FROM emplyee GROUP BY departmentid )
【185解题思路】:求每个部门工资前三名的员工信息;
1、每个部门工资前三的。(分部门求部门前三的值)说明要分组也要排序
先说排序,前三的,甭管并列的还是没有并列的,肯定都得有。所以窗口函数dense_rank()
select *,dense_rank() over(order by salary desc) from emplyee;
这肯定就是所有数据中薪水按倒序排列的。包括各个部门的。那这得到的结果跟我们想要的结果还是不一样。所以分组怎么搞??
partition by 分组 order by 排序
SELECT
*,
dense_rank ( ) over ( PARTITION BY departmentid ORDER BY salary DESC ) AS `rank`
FROM
emplyee;
2、每个部门薪水前三的员工信息。那就是求出所有满足上面sql语句的前三名就好了;
SELECT
*
FROM
( SELECT *, dense_rank ( ) over ( PARTITION BY departmentid ORDER BY salary DESC ) AS `rank` FROM emplyee ) AS A
WHERE
`rank` <= 3;