2021-06-05

1 Write your MySQL query statement below

#排序
#去重
#返回的是上面有字段的名称SecondHighestSalary,所以使用as。
#desc 降序,因为要第二大的数据。
#IFNULL(expr1,expr2);如果不为空返回的是第一个参数,如果为空,返回第二个参数。

select ifNull((select distinct Salary from Employee order by Salary desc limit 1,1),null) as SecondHighestSalary;

1.limit()方法中不能参与运算,因为索引从0开始,所以要 - 1,最好在外面就设定好 set N = N - 1

2.别名中不能带参数,一开始看到测试用例表,使用的别名是getNthHighestSalary(2),就用了getNthHighestSalary(N)做别名,一开始报错还不知道是哪,后面删去变量即可

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
#limit 方法不能参与运算,要想设置在limit中,就先在前面设置好。
BEGIN
set N = N-1;
  RETURN (
      select ifNull(
          (select distinct salary from employee order by salary 
          desc limit N,1),null) AS getNthHighestSalary
      
  );
END
窗口函数的区别

    rank()

    排名为相同时记为同一个排名, 并且参与总排序

    dense_rank() over (PARTITION BY xx ORDER BY xx [DESC])

    排名相同时记为同一个排名, 并且不参与总排序

    row_number() over (over (PARTITION BY xx ORDER BY xx [DESC]))

    排名相同时记为下一个排名

窗口函数在hive sql中经常使用, 也可在 mysql 8.0 之上的版本中使用
SELECT
Score ,
dense_rank() over (order by Score desc) as ‘Rank’
– 不指定 partition by 相当于所有行数据一个 partition, 数据进行区内排序
– dense_rank() 相当于每一行数据一个窗口, 对数据进行比较
FROM Scores;

rank() over:查出指定条件后的进行排名。特点是,加入是对学生排名,使用这个函数,成绩相同的两名是并列,下一位同学空出所占的名次。1,2,2,4
dense_rank() over,并不空出所占的名次1,2,2,3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值