SQL开窗函数 row_number(),dense_rank(), rank()

一、背景知识

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表:

原文地址:https://www.cnblogs.com/xuwinwin/p/15812004.html