SQL-每日一题【177. 第N高的薪水】

文章介绍了如何使用SQL查询Employee表中的第n高工资,涉及DISTINCT、LIMIT子句和条件判断,当没有第n高工资时返回NULL。解题策略包括先对工资去重,然后根据去重后的工资数量判断是否大于n,利用LIMIT获取结果。
摘要由CSDN通过智能技术生成

题目

表: 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

测试结果

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值