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:
    如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!
    程序员打怪之路

  • 相关阅读:
    在 Win7 下使用 VS2005 编译 Chrome
    C++ Qt 05:Qt布局管理器 荒 木 博客园
    电商们都挺贼的,便宜的东西都不肯卖,比如牙膏,谁要用一支20多的呀,3-4块的中华没人进货,
    python 下载 国内
    爱慕集团以及爱慕在线科技有限公司简介 Aimerman
    Build Instructions (Windows) The Chromium Projects
    C++ Qt 03:MainWindow和Qt Gui编程
    今天 穿vancl的衣服撞衫了,ooooooooppppppppppppppps
    2006年世界杯小组赛日程表
    C++ 虚函数表解析
  • 原文地址:https://www.cnblogs.com/jason1990/p/11647576.html
Copyright © 2011-2022 走看看