题目来自leetcode
记录题型,做题方法,错误原因和注意事项
如有问题 请及时纠正
1.分数排序
要求:如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
SELECT Score, dense_rank() over(order by Score DESC)
AS 'Rank' from Scores;
这里用dense_rank()来对成绩进行排序
row_number(),rank(),dense_rank()的区别
- row_number() 按前后顺序依次连续递增排序 相同数值的排名是不同的 1,2,3,4,5…
- rank() 相同数值的排序相同 总体排名可能不连续 基于个数进行排序 1,2,2,2,5… 主要用于学生成绩排名等
- dense_rank() 相同数值的排序相同 总体排名连续
1,2,2,2,3…
2.第n高的薪水
```bash
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N=N-1;
RETURN (
# Write your MySQL query statement below.
select ifnull((select distinct Salary from Employee order by Salary DESC
limit N,1),NULL)
);
END
思路:先按薪水降序排序,使用limit x,y 去掉前面x行的值,取后面y行
由于要取第n个,所以set n=n-1,即去掉前面n-1,去后面1
注:
1)用ifnull()使没有的情况下取null
2)如果要取拥有第n高薪水人的信息,不能直接在原基础上加上其他列,会取不到相同薪水的人员;要先得到第n高的薪