一、背景知识
ROW_NUMBER() 不允许并列且不留空,如: 1,2,3,...
RANK()允许并列且留空 ,学生考试排名的排序方法,如:1,1,3,...
DENSE_NUMBER() 允许并列且不留空,如: 1,1,2,2,3,...
二、说明
row_number(),无参函数,括号不能省略
观察发现第二个窗口的第1,2行amount值相等都为800,但排名不是并列第一,
为实现并列排名dense_rank() 排名序号连续,rank()函数排名序号不连续
对比如下:
注意where子句中不能使用开窗函数和聚合运算,所以用表子查询完成筛选,特别主要表子查询对表必须起别名,where才能引用排名字段
三、题例
找到每类试卷得分的前3名,如果两人最大分数相同,选择最小分数大者,如果还相同,选择uid大者。
select tag,uid,ranking from( SELECT tag,uid, row_number() over(partition by tag order by max(score) desc,min(score) desc,max(uid) desc) as ranking #可以在开窗函数里使用聚合函数 from exam_record left join examination_info using(exam_id) where submit_time is not null group by tag,uid) as t where ranking in (1,2,3) ;
examination_info表:
exam_record表: