MYSQL练习题:部门工资前三高的所有员工
其他相关的文章收集:
问题描述:
SQL经典题目之一:求部门工资前三高的所有员工。 题目内容包含两个表格Employee和Department 。
#Employee +----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 85000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | | 5 | Janet | 69000 | 1 | | 6 | Randy | 85000 | 1 | | 7 | Will | 70000 | 1 | +----+-------+--------+--------------+ #Department +----+----------+ | Id | Name | +----+----------+ | 1 | IT | | 2 | Sales | +----+----------+
答案整理:
解法一:使用窗口函数
解题思路: 1) 因为Employee中有DepartmentId,可以直接根据部门ID分组,给员工工资排序,选择前三员工信息; 2)Join连接Employee表和Department表,得出部门名称。
SELECT B.Name AS Department, A.Name AS Employee, A.Salary FROM (SELECT DENSE_RANK() OVER (partition by DepartmentId order by Salary desc) AS ranking,DepartmentId,Name,Salary FROM Employee) AS A JOIN Department AS B ON A.DepartmentId=B.id WHERE A.ranking<=3 #结果输出: IT Joe 85000.00 IT Randy 85000.00 IT Will 70000.00 IT Max 69000.00 IT Janet 69000.00 Sales Henry 80000.00 Sales Same 60000.00
解法二:使用 JOIN 和Where
解题思路:公司里前 3 高的薪水意味着有不超过 3 个工资比这些值大。
SELECT d.Name AS Department, e1.Name AS Employee, e1.Salary FROM Employee e1 JOIN Department d ON e1.DepartmentId = d.Id WHERE #工资级别数量小于等于3,即最多只有3个工资级别,也就是前三高 3 > (SELECT COUNT(DISTINCT e2.Salary) FROM Employee e2 WHERE #e2的工资级别大于等于e1的工资级别 e2.Salary > e1.Salary AND e1.DepartmentId = e2.DepartmentId ) ;
解法三:使用 JOIN 和Having
SELECT d.NAME AS Department, e1.NAME AS Employee, e1.salary AS Salary FROM employee AS e1 LEFT JOIN employee AS e2 ON e1.DepartmentId = e2.DepartmentId AND e1.Salary < e2.Salary LEFT JOIN department d ON e1.DepartmentId = d.id GROUP BY e1.Id HAVING count( DISTINCT e2.Salary ) <= 2