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