19,SQL训练之,力扣,176. 第二高的薪水

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

思路一 用limit 1 offset 1,来求

思路二,用开窗函数解答

五,SQL解答

解法一,去重+limit

解法二,窗口函数

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

Employee 表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| salary      | int  |
+-------------+------+
在 SQL 中,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                |
+---------------------+

三,建表语句

Create table If Not Exists Employee (id int, salary int)
Truncate table Employee
insert into Employee (id, salary) values ('1', '100')
insert into Employee (id, salary) values ('2', '200')
insert into Employee (id, salary) values ('3', '300')

四,分析

题解:

  • 员工表 字段 员工id 和员工薪水
  • 要求;薪水排名第二的薪水  如果第二高没有就返回null

咋一看这题很简单,其实有个坑在里面   第二高用limit很容易求出来 但是如果没有呢,所以还需要包上一层;

思路一 用limit 1 offset 1,来求

求之前 去重一下,保证薪水没有重复的

如果第二名没有,那么就返回null  很简单 加一个select就好

思路二,用开窗函数解答

第二种解法 ,用开窗求 统计函数可以求出 第二名的值 

最后如果是null  就返回null  一九四select 套一下就好

五,SQL解答

解法一,去重+limit

select (
    select distinct salary  from employee order by salary desc limit 1,1
           ) as SecondHighestSalary;

解法二,窗口函数

select  (
    with  t1 as (
    select distinct *,
dense_rank() over(order by salary desc) ro
from Employee
)
select max(salary) as SecondHighestSalary from t1 where t1.ro =2
           ) as SecondHighestSalary

 

六,验证

七,知识点总结

  • limit 取值练习,第一个是页数,第二个是数量;
  • limit 后面可以跟上offset  也是范围取值;
  • 窗口函数 row_number的用法;
  • 最后这一题重点是造空值 null出来
  • select可以快速造一个null值

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

  • 28
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值