题目
表: Employee
编写一个SQL查询来报告 Employee
表中第 n
高的工资。如果没有第 n
个最高工资,查询应该报告为 null
。
查询结果格式如下所示。
示例 1:
示例 2:
解题思路
前置知识
SET
SET是SQL Server中对已经定义的变量赋值的方式,
Case函数
case sex when '1' then '男' when '2' then '女' else '其他' end
Case搜索函数case when sex = '1' then '男' when sex = '2' then '女' else '其他' end
这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。比如说,下面这段sql,你永远无法得到“第二类”这个结果
case when col_1 in ( 'a', 'b') then '第一类' when col_1 in ('a') then '第二类' else'其他' end
limit
limit子句可以被用于强制lSELECT语句返回指定的记录数。limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是0(而不是1):
结构
limit函数结构为:limit m , n,表示从第m+1条数据取出n条数据。
例子
查找入职员工时间排名倒数第三的员工所有信息select * from `user` where date = (select distinct date from `user` order by date desc limit 2,1);
将入职时间降序排列,从第三个位置(即2+1处)取一条数据,也就是第三条数据本身,就是我们想要的入职时间为倒数第三的这条数据,需要注意将时间去重,按时间分组,相同时间会分为一组。
有了以上知识我们来解决一下这个问题
1.题目要求我们查询第n高的薪水,但是薪水会存在相同的情况,所以我们应该先给薪水字段去重(distinct salary)
2.之后我们判断去重后的薪水的值的个数是否还大于n(count(distinct salary)>n)
3.由于limit函数中不允许存在运算式,并且limit初始记录行的偏移量是0(而不是1),所以我们应该在return前对n进行减1.
4.如果去重后的薪水的值的个数大于n,我们就分组并排序然后limit取第1个((select salary from employee group by salary order by salary desc limit n,1))
5.若小于则返回null(else null end)
代码实现
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set N=N-1;
RETURN (
# Write your MySQL query statement below.
select
case when count(distinct salary)>n
then (select salary from employee
group by salary
order by salary desc
limit 1 offset N)
else null
end
from employee
);
END
测试结果