今天要解的是:177. Nth Highest Salary(求第N高的工资)。

这里要注意这样一句话👇:

如果没有第N高的工资,就要输出NULL。

  • 首先看此题考察的知识点:IFNULL(判断空值)函数用法和LIMIT用法。

  • 其实这题可以说是👉 176. Second Highest Salary (求第二高工资) 的升级版。建议大家先看看第二高的题解会更易懂这题。

  • 解题思路👉:此题要求第N高,那么重点就在N这个数字上
    第一种情况,N不为0的时候:假如N=1,那就是第一高,也就是索引为0(N - 1)的值;假如N=3,那就是第三高,即索引为2的值。
    但是要注意一个特殊的情况❗👉那就是N = 0的时候,此时没有最值;这就是题目说的第二种情况,此时需要返回NULL。
    所以这题也就演变成了一个判断N是否为NULL的题,而我们所熟知的可以解决这个判断问题的函数就是IFNULL函数

  • 下面提供几个参考解法

    • 第一个解法:IFNULL 函数+ LIMIT函数。

      该解法最易懂,且简洁。不过这里要注意!!!记得先声明变量m 为INT,并把N-1 赋值给 m,才不会报错。
    • 第二种解法:使用窗口函数的DENSE_RANK() 方法。

      此法也好懂,首先对salary按降幂排序,然后把生成的序号列作为新字段 num ;只要N 等于窗口t 里面的num,则找到第N高的工资。
    • 第三种解法:逆向思维,如果要取第N高的工资,反过来想👉就是找这前N个工资里面最小的那个。 比如我们要取第3高的工资👉(eg:10000,9000, 8000, 7000, 6000 五个工资数)就先找到前三的工资(即10000,9000, 8000)这个表,最后从该表取最小那个(8000)就是第三高的工资。
      当然这里也要注意,如果N个数不满足时返回NULL的情况(即只有两个工资数,但是我们要取第三高;那么就会返回NULL) 所以这里也需要一个IF来比较前N个数 count 和 N的大小。

好啦,这题就到这里吧,下一篇把这个类似的几类题做个汇总小结😁。

参考资料:
力扣-数据库之177题 题解区