• MYSQL练习题:部门工资前三高的所有员工


    其他相关的文章收集: SQL数据库语法及题目汇总


    问题描述:

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    答案整理:

    解法一:使用窗口函数

    解题思路:
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    解法二:使用 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
            )
    ;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    解法三:使用 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/department-top-three-salaries

  • 相关阅读:
    为什么su模型导入3D有黑点?原因分析与解决方案---模大狮模型网
    数据库笔记
    组件间通信
    【Unity面试】 Unity基础核心 | 面试真题 | 全面总结 | 建议收藏
    Log4j日志级别及使用规范
    transformer总结超详细代码篇
    Go :验证编译器是否检测到错误的switch语句(附完整源码)
    增速冠军 | 超云AI与信创实践典范,引领IDC中国服务器市场
    2024年阿里云4月服务器有哪些优惠活动?
    操作系统-设备
  • 原文地址:https://blog.csdn.net/WHYbeHERE/article/details/108573682