21,SQL训练之,力扣,177. 第N高的薪水

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

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,SQL解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

表: Employee

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| salary      | int  |
+-------------+------+
在 SQL 中,id 是该表的主键。
该表的每一行都包含有关员工工资的信息。

查询 Employee 表中第 n 高的工资。如果没有第 n 个最高工资,查询结果应该为 null 。

查询结果格式如下所示。

示例 1:

输入: 
Employee table:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+
n = 2
输出: 
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+

示例 2:

输入: 
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
+----+--------+
n = 2
输出: 
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 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 和员工薪水
  • 要求;薪水排名第N的薪水  如果第N高没有就返回null

编写一个存储过程来实现,也就是编写一个函数 传入一个参数 

正好我们可以用窗口函数来实现

先开窗  拿到不同的薪资的 高低排序

假设我们是2  来求一下  后期2可以换成N

最后如果第二名没有 就给一个null

最后编写一个存储过程,然后把2换成参数

五,SQL解答

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
 RETURN (
     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 =N
           ) as SecondHighestSalary

 );
END

六,验证

七,知识点总结

假设我们求的是第二名:

  • select可以快速造一个null值
  • 开窗之前去重一下
  • 开窗统计函数可以快速求到不同薪资的排名
  • 然后我们假设是2
  • 验证一下
  • 无误之后换成变量N

开窗函数 row_number练习;

存储过程练习;

select 造一个空值练习

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值