之前在将分析函数的时候提到过 row_number([Oracle 专题] SQL 分析函数(窗口函数 over)),用于排序,关于排名的方法还有 rank,dense_rank。
创建基础表:

create table tmp_rank(
  classnm varchar2(10), 
  student varchar2(10), 
  score number
);

插入数据:

insert into tmp_rank values('CLASS_A', 'STUDENT_1', 91);
insert into tmp_rank values('CLASS_A', 'STUDENT_2', 92);
insert into tmp_rank values('CLASS_A', 'STUDENT_3', 93);
insert into tmp_rank values('CLASS_A', 'STUDENT_4', 94);
insert into tmp_rank values('CLASS_A', 'STUDENT_5', 95);
insert into tmp_rank values('CLASS_B', 'STUDENT_1', 88);
insert into tmp_rank values('CLASS_B', 'STUDENT_2', 89);
insert into tmp_rank values('CLASS_B', 'STUDENT_3', 90);
insert into tmp_rank values('CLASS_B', 'STUDENT_4', 91);
insert into tmp_rank values('CLASS_B', 'STUDENT_5', 92);
commit;

查询:

select t.*,
       row_number() over(partition by t.classnm order by t.score) as "分年级排名",
       row_number() over(order by t.score) as "不分年级排名",
       rank()       over(order by t.score) as "不分年级排名",
       dense_rank() over(order by t.score) as "不分年级排名"
  from tmp_rank t
 order by t.classnm;

数据:

解析:

row_number,传统的排序,结果连续,且与总数一致;

rank,分数相同的情况下,共用一个名次,跳过下一个名次,结果不连续;

dense_rank,分数相同的情况下,共用一个名次,不跳过下一个名次,结果连续;

实际上,rank、dense_rank 还有一些其他用法(上述用的分析函数,也叫解析函数),官网叫做汇总方法:

例子:

意思是:90分的成绩在总数据中排第几名。rank 中的参数需要与 group 后的参数一致,可以有多个。

dense_rank,同理。

最后修改:2021 年 10 月 25 日
如果觉得我的文章对你有用,请随意赞赏