美文网首页zhaoyqiu的数据分析进阶之路2.0
D8-leetcode176、第二高的薪水(简单)

D8-leetcode176、第二高的薪水(简单)

作者: 喝奶茶不加奶茶 | 来源:发表于2020-07-02 08:01 被阅读0次

https://leetcode-cn.com/u/zhaoyqiu/

176、第二高的薪水
(1)按照薪水降序进行排序

select * from Employee 
order by Salary desc

发现降序排列后,Id值的顺序也乱了,本来还想选取降序排列后的第二个Id进行查询呢?看来需要换个思路:
增加有序的一列?
思路:
(1) 按照Salary降序查询

select * from Employee
order by Salary desc;

(2) 降序后发现id顺序变乱,故新增一列自增的字段new_id,以便于后续第二高薪水的查询

alter table (select * from Employee
order by Salary desc)  a
add new_id int(4) not null primary key auto_increment first;

出现错误:原因应该是alter table后面应该是需要数据库里存在的一张表,而不是子查询的一张表。

(3) 根据new_id=2查询第二高薪水:
select Salary as SecondHighestSalary
from (alter table (select * from Employee
order by Salary desc) a
add new_id int(4) not null primary key auto_increment first)
where new_id=2;
但是这个思路有很多bug,比如重复值、空值都没有考虑

利用limit?

select Salary as  SecondHighestSalary 
from Employee
order by Salary desc 
limit 1,1;

但是,没有考虑空值,提交报错.
利用ifnull()修改如下:

select ifnull((select Salary  
from Employee
order by Salary desc 
limit 1,1),null) as  SecondHighestSalary;

但是没有考虑重复值(比如有两个相同值),利用distinct 继续修改如下

select ifnull((select distinct Salary  
from Employee
order by Salary desc 
limit 1,1),null) as  SecondHighestSalary;

参考答案:
方法一:排除法:找到最大值,排除它,再找最大值
(1)找到最大值。

select max(Salary)  from Employee;

(2)找到比最大值小的最大值。

select max(Salary)  as SecondHighestSalary from Employee 
where salary<
(select max(Salary)  from Employee);

方法二:偏移法 limit offset
(1)对薪水降序排序,并偏移到第二个值

select * from Employee 
order by Salary
limit 1
offset 1;

(2)记得去重,防止出现重复值影响结果

select distinct Salary as SecondHighestSalary  from Employee 
order by Salary
limit 1
offset 1;

(3)还需要考虑空值的情况
框架:
select ifnull((),null);
详细代码:

select ifnull((select distinct Salary   from Employee 
order by Salary
limit 1
offset 1) ,null) as SecondHighestSalary;

补充:
(a)mysql在现有表字段之前增加一列id,并赋值为自动递增

alter table 表名
add new_id int(4) not null primary key auto_increment first;

(b)删除字段
alter table 表 drop column 字段;

(c)更改记录
update Employee set Salary=200 where Id=2;

相关文章

  • D8-leetcode176、第二高的薪水(简单)

    https://leetcode-cn.com/u/zhaoyqiu/ 176、第二高的薪水(1)按照薪水降序进行...

  • 记录几条有用的sql

    获取第二高的薪水 获取第N高的薪水 分数排名 获取部门前3高的薪水 (分组排序取每组前3) 获取部门的最高薪水(...

  • LeetCode#[SQL] 176 第二高的薪水

    第二高的薪水 题目 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。 例如上述...

  • 【2020-02-25】leetcode sql

    177、第二高薪水编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。 +----...

  • 第二高的薪水

    需注意的点 题目要求不存在返回null,则用ifnull函数ifnull(A,B) 若不为空返回A,否则返回B可能...

  • 【leetcode】176. 第二高的薪水-简单

    【题目】 编写一个 SQL 查询,获取Employee表中第二高的薪水(Salary) 。 IdSalary110...

  • 第N高的薪水和排名问题

    求第二高的薪水和第N高的薪水没有区别,主要注意的是若有相同的薪水的时候后面是否跳过,这里使用了子查询。这里的是相同...

  • 每日Leetcode—SQL(2)

    177.第N高的薪水 方法: 分析:此题可以参照(176.第二高的薪水)的思路来解题,176中使用了limit 1...

  • sql:如何查找第N高的数据

    题目: 编写一个 SQL 查询,获取Employee表中第二高的薪水(Salary)。 分析: 1、查询第二高的薪...

  • SQL训练题

    组合两个表 第二高的薪水 第N高的薪水 分数排名 连续出现的数字 超过经理收入的员工 查找重复的电子邮箱 从不订购...

网友评论

    本文标题:D8-leetcode176、第二高的薪水(简单)

    本文链接:https://www.haomeiwen.com/subject/xljfqktx.html