[leetcode] 176.second highest salary 第二高薪水
write a sql query to get the second highest salary from the employee table.
+—-+——–+
| id | salary |
+—-+——–+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+—-+——–+
for example, given the above employee table, the second highest salary is 200. if there is no second highest salary, then the query should return null.
这道题让我们找表中某列第二大的数,这道题有很多种解法,先来看一种使用limit和offset两个关键字的解法,mysql中limit后面的数字限制了我们返回数据的个数,offset是偏移量,那么如果我们想找第二高薪水,我们首先可以先对薪水进行降序排列,然后我们将offset设为1,那么就是从第二个开始,也就是第二高薪水,然后我们将limit设为1,就是只取出第二高薪水,如果将limit设为2,那么就将第二高和第三高薪水都取出来:
解法一:
select salary from employee group by salary union all (select null as salary) order by salary desc limit 1 offset 1;
我们也可以使用max函数来做,这个返回最大值,逻辑是我们取出的不包含最大值的数字中的最大值,即为第二大值:
解法二:
select max(salary) from employee where salary not in (select max(salary) from employee);
下面这种方法和上面基本一样,就是用小于号<代替了not in关键字,效果相同:
解法三:
select max(salary) from employee where salary < (select max(salary) from employee);
最后来看一种可以扩展到找到第n高的薪水的方法,只要将下面语句中的1改为n-1即可,第二高的薪水带入n-1就是1,下面语句的逻辑是,假如我们要找第二高的薪水,那么我们允许其中一个最大值存在,然后在其余的数字中找出最大的,即为整个的第二大的值;
解法四:
select max(salary) from employee e1 where 1 = (select count(distinct(e2.salary)) from employee e2 where e2.salary > e1.salary);
参考资料:
到此这篇关于sql实现leetcode(176.第二高薪水)的文章就介绍到这了,更多相关sql实现第二高薪水内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!