文巾解题 177. 第N高的薪水

Posted 刘文巾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文巾解题 177. 第N高的薪水相关的知识,希望对你有一定的参考价值。

1 题目描述

注意:数据中salary可能有重复

2 解题思路

2.1 LIMIT 

这里salary可能有重复,所以为了算出答案,这里我们需要对salary进行一次grouping操作。

排名第N高意味着要跳过N-1个薪水。

但是,limit和offset字段后面只接受正整数(意味着0、负数、小数都不行)或者单一变量(意味着不能用表达式)。

也就是说想取一条,limit 2-1、limit 1.1这类的写法都是报错的。

所以需先在函数开头处理N为N=N-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

文巾解题 176. 第二高的薪水_刘文巾的博客-CSDN博客 一样,如果我们不放心NULL的出现的话,我们也可以使用IFNULL函数:

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
    SET N := N-1;
  RETURN (
      SELECT 
         IFNULL((
                SELECT e.Salary
                FROM Employee e
                GROUP BY e.Salary
                ORDER BY e.Salary DESC
                LIMIT N, 1),
                NULL
      ) AS  getNthHighestSalary
  );
END

2.2 子查询

1)排名第N的薪水意味着在数据集中中存在N-1个比其更高的薪水(这里的N-1个更高的薪水是指去重后的N-1个,实际对应人数可能不止N-1个。最后返回的薪水也应该去重,因为可能不止一个薪水排名第N)
2)由于对于每个薪水,都要执行一遍子查询where条件,注定这种方法效率低下

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  RETURN (
      # Write your MySQL query statement below.
      SELECT 
          DISTINCT e.salary
      FROM 
          employee e
      WHERE 
          (SELECT count(DISTINCT salary) 
           FROM employee 
           WHERE salary>e.salary) = N-1
  );
END

2.3 笛卡尔乘积


CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  RETURN (
      # Write your MySQL query statement below.
      SELECT 
          e1.salary
      FROM 
          employee e1, employee e2 
      WHERE 
          e1.salary <= e2.salary
      GROUP BY 
          e1.salary
      HAVING 
          count(DISTINCT e2.salary) = N
  );
END

注:这里不能是N=N-1,同时e1.salary < e2.salary ,因为只有count(*)会计算NULL,count+字段会默认去掉NULL的内容。所以数据库中只有一条字段的时候,那样会报错

以上是关于文巾解题 177. 第N高的薪水的主要内容,如果未能解决你的问题,请参考以下文章

⭐️ LeetCode解题系列 ⭐️ 177. 第N高的薪水(Oracle dense_rank函数)

文巾解题 176. 第二高的薪水

leetcode177---查询第N高的薪水

177. 第N高的薪水

177. 第N高的薪水

Leetcode No.177 第N高的薪水