zoukankan      html  css  js  c++  java
  • 佛系每日养生题177. 第N高的薪水

    177. 第N高的薪水

    难度中等

    编写一个 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
      SET N = N-1;
      RETURN (
          # Write your MySQL query statement below.
          SELECT(
              SELECT DISTINCT Salary
              FROM Employee
              ORDER BY Salary DESC
              LIMIT 1 OFFSET N
          ) AS getNthHighestSalary
          
      );
    END
    

    场景分析:

    • 普通连续排名:300-200-200-100排名按1-2-3-4排名
    • 同级不连续:300-200-200-100排名按1-2-2-4排名
    • 同级连续:300-200-200-100排名按1-2-2-3排名

    Code1

    1. 同级连续,可以先Group By 分级再用Order By

    2. 排名第N高,即要Pass前N-1个数,LIMIT后不能直接接N-1,要先减去。

      limit和offset字段后面只接受正整数(意味着0、负数、小数都不行)或者单一变量(意味着不能用表达式),也就是说想取一条,limit 2-1、limit 1.1这类的写法都是报错的。

    CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
    BEGIN
        SET N := N-1;
      RETURN (
          # Write your MySQL query statement below.
          SELECT 
                salary
          FROM 
                employee
          GROUP BY 
                salary
          ORDER BY 
                salary DESC
          LIMIT N, 1
      );
    END
    
    

    注:这种解法形式最为简洁直观,但仅适用于查询全局排名问题,如果要求各分组的每个第N名,则该方法不适用;而且也不能处理存在重复值的情况
    未完待续...

  • 相关阅读:
    在Arch上使用Fcitx5
    博客园图片居中
    冒泡排序算法
    检查字符串是否包含另一串字符串(c++)
    辗转相除法(求最大公约数或最小公倍数)
    二叉树等总结
    应用jfinal发送微信模板消息的一个bug
    线程中wait/notify/notifyAll的用法
    应用jfinal时要注意区分Db.query和Db.find
    从源码角度简单看StringBuilder和StringBuffer的异同
  • 原文地址:https://www.cnblogs.com/hereisdavid/p/15700452.html
Copyright © 2011-2022 走看看