SQL实现LeetCode(176.第二高薪水)

[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!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐