天天看點

Oracle的排序函數

建立測試表:

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);
           

1、row_number函數:

它會為查詢出來的每一行記錄生成一個序号,依次排序且不會重複,注意使用row_number函數時必須要用over子句選擇對某一列進行排序才能生成序号。
select g.*,row_number() over(partition by g.cid order by g.fraction desc) 
as 排名 from grades g;--其中partition by是為了分組
           
Oracle的排序函數

2、rank()函數:

與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;
           
Oracle的排序函數

3、dense_rank()函數:

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;
           
Oracle的排序函數