zoukankan      html  css  js  c++  java
  • LeetCode——Department Top Three Salaries(巧妙使用子查询)

    The Employee table holds all employees. Every employee has an Id, and there is also a column for the department Id.
    
    +----+-------+--------+--------------+
    | 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            |
    +----+-------+--------+--------------+
    The Department table holds all departments of the company.
    
    +----+----------+
    | Id | Name     |
    +----+----------+
    | 1  | IT       |
    | 2  | Sales    |
    +----+----------+
    Write a SQL query to find employees who earn the top three salaries in each of the department. For the above tables, your SQL query should return the following rows (order of rows does not matter).
    
    +------------+----------+--------+
    | Department | Employee | Salary |
    +------------+----------+--------+
    | IT         | Max      | 90000  |
    | IT         | Randy    | 85000  |
    | IT         | Joe      | 85000  |
    | IT         | Will     | 70000  |
    | Sales      | Henry    | 80000  |
    | Sales      | Sam      | 60000  |
    +------------+----------+--------+
    Explanation:
    
    In IT department, Max earns the highest salary, both Randy and Joe earn the second highest salary, and Will earns the third highest salary. There are only two employees in the Sales department, Henry earns the highest salary while Sam earns the second highest salary.
    

    此题的难度在于,选择部门的前三位高工资人员(注意,允许并列人员的存在)。
    分析题目:

    • 存在两张表,则肯定需要使用join
    • 需要选取相同部门的前三名,原本想使用group by以及limit
    • 然而group by以及limit无法满足并列前三名的要求,因此,只能对同张表使用select count,如果某个薪水满足超过其的薪水(注意是不同的薪水)小于三个,则此人薪水在部门前三;

    综上所述,答案如下所示:

    # Write your MySQL query statement below
    SELECT Employee1.Name AS Employee, Employee1.Salary, Department.Name AS Department 
    FROM Employee AS Employee1, Department 
    WHERE 
        Employee1.DepartmentId = Department.Id
        AND 3 > (
            SELECT COUNT(DISTINCT Employee2.Salary)
            FROM Employee AS Employee2
            WHERE 
                Employee1.DepartmentId = Employee2.DepartmentId
                AND Employee1.Salary < Employee2.Salary
        )
    

    PS:
    如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!
    程序员打怪之路

  • 相关阅读:
    uva 10918 Tri Tiling
    uva 10943 How do you add?
    uva 10518 How Many Calls?
    convert函数用法小结转载
    GridView 实现服务器端和客户端全选的两种方法
    vs2008和vs10以及Windows Phone自带的1000多个 Windows 系统使用的各种图标、光标和动画文件
    添加滚动条的几个样式未完待续
    asp.net页面绑定数据的方式未完待续
    读取数据库中空字段的处理方法如下
    遇到一段让我尴尬的代码,有增长了点见识。
  • 原文地址:https://www.cnblogs.com/jason1990/p/11647576.html
Copyright © 2011-2022 走看看