请注意,本文编写于 591 天前,最后修改于 591 天前,其中某些信息可能已经过时。
之前在将分析函数的时候提到过 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,同理。