zoukankan      html  css  js  c++  java
  • leetcode Database3(Nth Highest Salary<—>Consecutive Numbers<—>Department Highest Salary)

    一、Nth Highest Salary

    Write a SQL query to get the nth highest salary from the Employee table.

    +----+--------+
    | Id | Salary |
    +----+--------+
    | 1  | 100    |
    | 2  | 200    |
    | 3  | 300    |
    +----+--------+
    

    For example, given the above Employee table, the nth highest salary where n = 2 is 200. If there is no nth highest salary, then the query should return null.

    分析:题意为编写SQL查询获取雇员表中的第n高薪水值。例如,给定上面的雇员表,当n为2时,第n高薪水为200.如果没有第n高薪水,查询返回null。

    代码:

    CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
    BEGIN
      set N=N-1;
      RETURN (
          # Write your MySQL query statement below.
          SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT N,1
      );
    END
    

     注意:我刚开始使用的是LIMIT N-1,1 但是will cause error,经过了解才发现

    Seems like MySQL can only take numeric constants in the LIMIT syntax. Directly from MySQL documentation:

    The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants (except when using prepared statements).

    二、Consecutive Numbers

    Write a SQL query to find all numbers that appear at least three times consecutively.

    +----+-----+
    | Id | Num |
    +----+-----+
    | 1  |  1  |
    | 2  |  1  |
    | 3  |  1  |
    | 4  |  2  |
    | 5  |  1  |
    | 6  |  2  |
    | 7  |  2  |
    +----+-----+
    

    For example, given the above Logs table, 1 is the only number that appears consecutively for at least three times.

    分析:题意为编写SQL去查询所有至少连续出现3次的数字。例如,给定上面的Logs表,1是唯一至少连续出现3次的数字。

    代码:

    使用join就好了

    # Write your MySQL query statement below
    SELECT DISTINCT a.Num As ConsecutiveNumbers
    FROM Logs a
    JOIN Logs b
    ON a.Num = b.Num
    JOIN Logs c
    ON b.Num = c.Num
    WHERE a.Id + 1 = b.Id
    AND b.Id + 1 = c.Id
    

    其他可参考解法:

    # Write your MySQL query statement below
    SELECT DISTINCT Num FROM (
      SELECT Num, COUNT(Rank) AS Cnt FROM (
        SELECT    Num,
          @curRank := @curRank + IF(@prevNum = Num, 0, 1) AS rank, @prevNum := Num
        FROM      Logs s, (SELECT @curRank := 0) r, (SELECT @prevNum := NULL) p
        ORDER BY  ID ASC
      ) t GROUP BY Rank HAVING Cnt >= 3 
    ) n;
    

    此解法配合使用MySQL用户定义变量和聚组函数统计连续出现的数字个数:

    以题目描述的Logs表为例,上面的SQL语句中,最内层的SELECT语句执行结果如下:

    +-----+------+-----------------+
    | Num | rank | @prevNum := Num |
    +-----+------+-----------------+
    |  1  |   1  |        1        |
    |  1  |   1  |        1        |
    |  1  |   1  |        1        |
    |  2  |   2  |        2        |
    |  1  |   3  |        1        |
    |  2  |   4  |        2        |
    |  2  |   4  |        2        |
    +-----+------+-----------------+

    执行结果中的rank列将Num转化为从1开始递增的序号,但序号只在Num出现变化时增加,(连续出现的相同数字序号也相同)

    第二层SELECT语句对rank进行计数,并只保留计数不小于3的条目,执行结果为:

    +-----+-----+
    | Num | Cnt |
    +-----+-----+
    |  1  |  3  |
    +-----+-----+

    最外层SELECT语句对Num进行去重。

    三、Department Highest Salary

    The Employee table holds all employees. Every employee has an Id, a salary, and there is also a column for the department Id.

    +----+-------+--------+--------------+
    | Id | Name  | Salary | DepartmentId |
    +----+-------+--------+--------------+
    | 1  | Joe   | 70000  | 1            |
    | 2  | Henry | 80000  | 2            |
    | 3  | Sam   | 60000  | 2            |
    | 4  | Max   | 90000  | 1            |
    +----+-------+--------+--------------+
    

    The Department table holds all departments of the company.

    +----+----------+
    | Id | Name     |
    +----+----------+
    | 1  | IT       |
    | 2  | Sales    |
    +----+----------+
    

    Write a SQL query to find employees who have the highest salary in each of the departments. For the above tables, Max has the highest salary in the IT department and Henry has the highest salary in the Sales department.

    +------------+----------+--------+
    | Department | Employee | Salary |
    +------------+----------+--------+
    | IT         | Max      | 90000  |
    | Sales      | Henry    | 80000  |
    +------------+----------+--------+
    

    分析:题意为

    雇员表Employee保存了雇员的Id,姓名,薪水以及部门Id。

    部门表Department保存了部门的Id和名称。

    编写一个SQL查询,找出每一个部门中薪水最高的员工信息。而且给出了样例结果。

    代码:

    可以先用临时表m查找出每个部门薪水最大值,然后使用薪水值和部门Id与表Employee进行内连接,再通过部门Id与表Dempartment做内连接即可。

    # Write your MySQL query statement below
    SELECT d.Name AS Department, e.Name AS Employee, m.Salary FROM
    Employee e 
    INNER JOIN 
    (SELECT DepartmentId, MAX(Salary) AS Salary FROM Employee GROUP BY DepartmentId) m
    USING(DepartmentId, Salary)
    INNER JOIN 
    Department d
    ON d.Id = m.DepartmentId
    

    或者这么写:

    select d.Name as Department, e.Name as Employee, e.Salary as Salary  
    from Employee e, Department d ,  
    (select DepartmentId ,MAX(Salary) as Salary from Employee group by DepartmentId  ) m  
    where e.DepartmentId=m.DepartmentId and e.Salary=m.Salary and d.Id=e.DepartmentId; 
    

    其他解法:

    SELECT D.Name AS Department, E.Name AS Employee, E.Salary AS Salary
    FROM Employee AS E, Department AS D
    WHERE E.DepartmentId = D.Id AND Salary >= ALL(
      SELECT Salary 
      FROM Employee E_TMP
      WHERE E_TMP.DepartmentId = E.DepartmentId);
    

      

  • 相关阅读:
    document.getElementById()使用方法
    Delphi XE7 发布时间
    JavaScript动态更改页面元素
    TCP/IP-协议族----17、应用层简单
    查看员工信息每个部门的最低工资
    VB6.0“挑衅”.NET!
    MapReduce计数器
    Linux学习记录--命名管道通信
    cocos2d-x V3.0 呼叫加速度计 Acceleration
    Linux Kernel(Android) 加密算法汇总(四)-应用程序调用OpenSSL加密演算法
  • 原文地址:https://www.cnblogs.com/carsonzhu/p/5223783.html
Copyright © 2011-2022 走看看