佛系每日养生题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名,则该方法不适用;而且也不能处理存在重复值的情况
未完待续...

上一篇:力扣1-200刷题总结(3/5)


下一篇:有余额2000,两个线程每次取200(同步锁)