今天又随手刷了一道leetcode的数据库题,这次是👉:176. Second Highest Salary 求第二高工资。乍看这题是不是觉得似曾相识?没错,之前掌柜写过另外两个题,分别是求部门最高工资的员工 和 求部门工资排前三的员工。其实那两题还稍微难点,因为涉及多表联合查询的;不过这道题看似简单些,里面却有两个坑需要注意避开!!!
掌柜一开始就没注意到,导致提交就报错😂。。。
上面这个错误❌的解法就是疏忽了第二个坑导致的,下面掌柜马上填坑👇。
- 第一个坑就是有可能会出现工资有重复的情况。比如刚好就有两个或三个都是200的工资,那么不去重(DISTINCT)就会得到不止一个第二高工资的数据,这还算是小坑,下面这个才是容易忽略的坑;
- 第二个就是有可能出现只有一条工资的情况。 即此时查询第二高的工资还是用掌柜那个查询语句就会出现空值的情况。。。然后就华丽丽地报错了!
所以此题主要考察地知识点👉:IFNULL的用法、临时表、LIMIT子句的使用
那么此题解题思路 其实只要注意上面两个坑就很好想到👇:
所谓第二高工资就是排序后最高工资的下一位,或者是 小于最高工资的集合,集合里面最大的那一位。
下面提供几个参考解法👈:
- 第一个就是临时表 + LIMIT的方法:
- 第二个就是IFNULL + LIMIT 的方法:
- 第三个就是直接 用MAX函数(其实有点逆向思维的味道🧐) 的方法:
- 最后还是可以用窗口函数的解法来解此题:
可以看出来,此题用窗口函数其实略复杂,不太建议;综上几种解法,可知第一种用临时表和LIMIT子句的解法略胜一筹。
PS:leetcode不知何时更新过可以用窗口函数了😁。
通过对176、184、185这三道题的对比可知,它们都可以用窗口函数来解决,所以下次如果再遇到类似的排名、排序这一类SQL问题,可以先考虑窗口函数解法。