查询第N高的数据 -- Leetcode题目解题思路与方法

Leetcode MySQL第176题:查询第二高的薪水

先看题目:
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary)

比较简单且在日常工作中应用频率比较高的要求,重点注意:
(1)可能有多个相同的薪水,注意去重
(2)当没有第二高的值时需要返回NULL值

方法1

思路:取出最大值,在小于最大值的情况下再取一次最大值
优点:可读性高,代码简洁
缺点:不易修改,继续取第N高值时只能继续嵌套子查询,后面会变得极度臃肿。
效率:192 ms,效率为三种方法中最慢

SELECT MAX(Salary) AS SecondHighestSalary
FROM Employee
WHERE Salary<(
    SELECT MAX(Salary)
    FROM Employee)

方法2

思路:排序,然后利用偏移取出排名第二的值
优点:效率高,易修改,可十分方便取出第N高的值
缺点:需嵌套IFNULL函数,不然无法返回出NULL值,降低了可读性
效率:156 ms,三种方法中最快
注意:需要使用DISTINCT去重

SELECT
    IFNULL(
      (SELECT DISTINCT Salary
       FROM Employee
       ORDER BY Salary DESC
        LIMIT 1 OFFSET 1),
    NULL) AS SecondHighestSalary

方法3

思路:使用窗口函数RANK()排序,取RANK=2的值
优点:易修改,方便取第N高的值
缺点:可读性不高,效率上较第二种方法无优势,主要锻炼窗口函数的应用
效率:166 ms,效率为第二快
注意:需要使用DISTINCT去重

SELECT 
  IFNULL(
    (SELECT DISTINCT Salary FROM (SELECT *,RANK() OVER(ORDER BY Salary DESC) AS `rank` FROM Employee) AS t1 WHERE `rank` = 2), 
    NULL) AS SecondHighestSalary
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容