最近练习SQL中遇到两道开窗函数题目在此记录
例一:成绩表
SC(Sno,Cno,score)
--Sno 学生编号,Cno 课程编号,score 分数
要求:查询各科成绩前三名的记录:(不考虑成绩并列情况)
1 select * 2 from (select sno, 3 cno, 4 score, 5 row_number() over(partition by cno order by score desc) rn 6 from sc) 7 where rn < 4
https://leetcode-cn.com/problems/second-highest-salary/
1 select max(salary) as SecondHighestSalary 2 from (select salary, row_number() over(order by salary desc) rn 3 from employee) 4 where rn = 2
说明:
1、原先自己写答案的时候,没有加max()导致提交失败。后续思考才明白为什么要加max():使用dense_rank()函数时,有可能会有rn=2 返回多条的情况,根据题目要求需要取第二高薪水,返回值应为一条;
2、另外为什么要使用dense_rank()函数:
rank()函数首先被排除,在rn=1有两个值的情况下,失败;
row_number()函数在入参为{"headers": {"Employee": ["Id", "Salary"]}, "rows": {"Employee": [[1, 100], [2, 100]]}}情况下失败;
参考文档:https://www.cnblogs.com/qiuting/p/7880500.html