LeetCode - 176. 第二高的薪水

  • 题目
    • 来源:力扣(LeetCode)
    • 描述

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

      Id Salary
      1 100
      2 200
      3 300

      例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。

      SecondHighestSalary
      200
  • 题解
    • 解法一(MAX + 子查询)

      SELECT MAX(Salary) AS SecondHighestSalary
      FROM Employee
      where salary < (
      SELECT MAX(Salary)
      FROM Employee
      )
    • 解法二(limit + IFNULL + distinct)

      select IFNULL((
      select distinct e.Salary
      from Employee e
      order by e.Salary desc
      limit 1,1
      ),null) as SecondHighestSalary
    • 解法三(limit + distinct,其实可以不需要IFNULL!?)

      SELECT
      (SELECT DISTINCT
              Salary
          FROM
              Employee
          ORDER BY Salary DESC
          LIMIT 1 OFFSET 1) AS SecondHighestSalary
      • 解法四
        • 有点笨,先从大到小取出一、二名,然后再从小到大取出第一个。可能更适合其他更通用的场景?
        • 这里要注意内层查询中的limit 1,1和limit 0,2的效果不同,因为当只有一条数据时,1,1返回的是空集合,而0,2返回的是含有一条数据的集合,再给到上层查询再从小到大limit时,后者就会导致异常,不能返回null了。
      select IFNULL((
          select s.Salary as SecondHighestSalary
          from
          (select distinct e.Salary
          from Employee e
          order by e.Salary desc
          limit 1,1) s
          order by s.Salary asc
          limit 1
      ),null) as SecondHighestSalary
  • 考点
    • 特殊情况
      • 只有一条数据时,要返回null
      • Salary都相同的数据时,应该返回null,也就是说都认为是最大的值,而不能认为第二大的值也是该值
        • 可以在子查询中用distinct来处理
    • limit + distinct (IFNULL可用可不用)
      • 如果limit后面设置的范围超出数据总量,select语句返回的会是一个空集合,而不是含有null值的集合。如果想要返回null,那么就要外层再套一层select来取该列的值。所以其实可以不需要IFNULL!?
    • MAX

猜你喜欢

转载自www.cnblogs.com/wyp1988/p/12101160.html