创建测试表:
create table Grades
(
Sid varchar2(10),
Cid varchar2(10),
Fraction number(8,3)
);
insert into Grades values('01' , '01' , 80);
insert into Grades values('01' , '02' , 90);
insert into Grades values('01' , '03' , 99);
insert into Grades values('02' , '01' , 70);
insert into Grades values('02' , '02' , 60);
insert into Grades values('02' , '03' , 80);
insert into Grades values('03' , '01' , 80);
insert into Grades values('03' , '02' , 80);
insert into Grades values('03' , '03' , 80);
insert into Grades values('04' , '01' , 50);
insert into Grades values('04' , '02' , 30);
insert into Grades values('04' , '03' , 20);
insert into Grades values('05' , '01' , 76);
insert into Grades values('05' , '02' , 87);
insert into Grades values('06' , '01' , 31);
insert into Grades values('06' , '03' , 34);
insert into Grades values('07' , '02' , 89);
insert into Grades values('07' , '03' , 98);
它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。
select g.*,row_number() over(partition by g.cid order by g.fraction desc)
as 排名 from grades g;--其中partition by是为了分组
与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个,也就是相关行之前的排名数加1,rank()函数会跳号,遇到相同值,排序不连续
select g.*,rank() over(partition by g.cid order by g.fraction desc)
as 排名 from grades g;
dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号,rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第三名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。
select g.*,dense_rank() over(partition by g.cid order by g.fraction desc)
as 排名 from grades g;