zoukankan      html  css  js  c++  java
  • leetcode Sql题目总结 第二弹~

    1,

    编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。

    +----+--------+
    | Id | Salary |
    +----+--------+
    | 1 | 100 |
    | 2 | 200 |
    | 3 | 300 |
    +----+--------+
    例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 n 高的薪水,那么查询应返回 null。

    +------------------------+
    | getNthHighestSalary(2) |
    +------------------------+
    | 200 |
    +------------------------+

    CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
    BEGIN
         DECLARE P INT DEFAULT N-1;
         SET P = N-1;
         IF (P<0) THEN
         RETURN NULL;
         ELSE
         RETURN (
         SELECT IFNULL(
          (
           SELECT DISTINCT Salary
           FROM Employee
           ORDER BY Salary DESC
           LIMIT P, 1
          ), NULL
        ) AS SecondHighestSalary
    );
    END IF;
    END 

    注意:

    (1),在navicat 中跑这个代码时,要在第一行写delimiter // ,不然DECLARE定义变量会报错的。

    (2),执行函数不用call命令,应该是select getNthHighestSalary(3) 

    2,编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

    +----+-------+
    | Id | Score |
    +----+-------+
    | 1 | 3.50 |
    | 2 | 3.65 |
    | 3 | 4.00 |
    | 4 | 3.85 |
    | 5 | 4.00 |
    | 6 | 3.65 |
    +----+-------+
    例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

    +-------+------+
    | Score | Rank |
    +-------+------+
    | 4.00 | 1 |
    | 4.00 | 1 |
    | 3.85 | 2 |
    | 3.65 | 3 |
    | 3.65 | 3 |
    | 3.50 | 4 |
    +-------+------+

    -- 方法: 自连接
    -- 目的:对于一个成绩,查找出大于等于它的成绩(去重)的数量即为其排名,整理排序即得结果
    SELECT
    a.Score AS Score,
    COUNT(DISTINCT b.Score) AS Rank -- 注意按题目要求去重复值
    FROM Scores AS a, Scores AS b
    WHERE b.Score >= a.Score -- 表b中有x个非重复值大于等于表a当前值,则表a当前成绩排名为x
    GROUP BY a.id -- 由于成绩即使重复也要显示,故通过id分组
    ORDER BY a.Score DESC

    3.

    Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。

    +----+-------+--------+--------------+
    | Id | Name | Salary | DepartmentId |
    +----+-------+--------+--------------+
    | 1 | Joe | 70000 | 1 |
    | 2 | Henry | 80000 | 2 |
    | 3 | Sam | 60000 | 2 |
    | 4 | Max | 90000 | 1 |
    +----+-------+--------+--------------+
    Department 表包含公司所有部门的信息。

    +----+----------+
    | Id | Name |
    +----+----------+
    | 1 | IT |
    | 2 | Sales |
    +----+----------+
    编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。

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

    # Write your MySQL query statement below

    SELECT Department.name AS 'Department',
                   Employee.name AS 'Employee',
                   Salary
    FROM  Employee  JOIN  Department

    ON Employee.DepartmentId = Department.Id

    WHERE
                 (Employee.DepartmentId , Salary) IN
                ( SELECT
                              DepartmentId, MAX(Salary)
                  FROM  Employee
                 GROUP BY DepartmentId
                   );


    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    Oracle(00):PL/SQL嵌入SQL语句
    Oracle(00):CASE WHEN 用法
    Oracle(00):正则表达式
    Oracle(00):删除重复记录
    Oracle(00):PL/SQL块与表达式
    Oracle(00):PL/SQL复合类型
    Oracle(00):PL/SQL数据类型
    Oracle(00):rownum行号
    Oracle(00):递归查询connect by
    Oracle(00):Update语句
  • 原文地址:https://www.cnblogs.com/cheng-cheng/p/11350139.html
Copyright © 2011-2022 走看看