自学内容网 自学内容网

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

在这里插入图片描述

如果是空表也要返回 nullifnull 函数可以处理

实现二

现在,我们知道 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)!