- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
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 造一个空值练习
- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用