176,第二高的薪水
第二高的薪水
目标
Employee
表:
+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| salary | int |
+-------------+------+
id 是这个表的主键。
表的每一行包含员工的工资信息。
查询并返回 Employee
表中第二高的 不同 薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None)
。
查询结果如下例所示。
示例 1:
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
示例 2:
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| null |
+---------------------+
分析
第一步:对工资去重并进行降序排列
第二步:取出第二高的工资
第三步:如果没有第二高的工资则返回 null
,在这里,我们使用 ifnull
函数来处理空表,因为假设表中只有一条记录,我们在查询时会返回一个空表,而 ifnull
函数可以对空表进行处理
实现一
select
ifnull(
(select distinct Salary
from employee
order by Salary desc
limit 1, 1),
null) AS SecondHighestSalary;
在上面的代码中,如果表中只有一条数据,我们开启事务来模拟表中只有一条数据的情况
begin;
delete from employee where id in (
2, 3
);
select * from employee;
rollback;
那么下面的代码会返回这样的结果
select distinct Salary
from employee
order by Salary desc
limit 1, 1
如果是空表也要返回 null
则 ifnull
函数可以处理
实现二
现在,我们知道 ifnull
可以处理空表的情况,然而我们希望使用 topN 的思路来解决问题,这时我们需要使用除了 count
的其他聚合函数来处理空表(sum、avg、min、max),这些函数在处理空表时同样会返回 null
with t1 as (
select
*,
dense_rank() over (order by salary desc) rn
from employee
)select distinct ifnull(max(salary), null) SecondHighestSalary from t1 where rn = 2;
注意:这里不能使用 sum
函数,因为聚合函数在 distinct
之前执行
总结
1、ifnull
可以处理空表
2、除了 count
的其他聚合函数来处理空表(sum、avg、min、max),这些函数在处理空表时同样会返回 null
原文地址:https://blog.csdn.net/qq_54889094/article/details/142949837
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!