我们直接来动手实验吧,原理性的描述可以网上百度。
step 建表
create table ttt(name varchar2(10),class number,grade number);
构造如下数据,插入到表中
fda 1 80
ffd 1 78
dss 1 95
cfe 2 74
gds 2 92
gf 3 99
ddd 3 99
adf 3 45
asdf 3 55
3dd 3 78
rank()--rank 跳跃性排序 eg:有两个第一,接下来就是第三 ,grade 按同一clas,降序显示
select name,class,grade,rank()over(partition by class order by grade desc) sort_num from ttt;

row_number() select name,class,grade,row_number() over(partition by class order by grade desc) mm from ttt;

dense_rank()select name,class,grade,dense_rank() over(partition by class order by grade desc) mm from ttt;

需求:求每个班中,成绩为第一名的学生。(可能存在多个人并列第一)
dense_rank()与RANK()都可以 ,row_number() 只能取得一位。
扩展: --按分组的列累计,分组后给出总和
select name,class,grade,sum(grade) over(partition by class order by grade desc) mm ,
sum(grade) over(partition by class ) mm02
from ttt;

step 建表
create table ttt(name varchar2(10),class number,grade number);
构造如下数据,插入到表中
fda 1 80
ffd 1 78
dss 1 95
cfe 2 74
gds 2 92
gf 3 99
ddd 3 99
adf 3 45
asdf 3 55
3dd 3 78
rank()--rank 跳跃性排序 eg:有两个第一,接下来就是第三 ,grade 按同一clas,降序显示
select name,class,grade,rank()over(partition by class order by grade desc) sort_num from ttt;

row_number() select name,class,grade,row_number() over(partition by class order by grade desc) mm from ttt;

dense_rank()select name,class,grade,dense_rank() over(partition by class order by grade desc) mm from ttt;

需求:求每个班中,成绩为第一名的学生。(可能存在多个人并列第一)
dense_rank()与RANK()都可以 ,row_number() 只能取得一位。
扩展: --按分组的列累计,分组后给出总和
select name,class,grade,sum(grade) over(partition by class order by grade desc) mm ,
sum(grade) over(partition by class ) mm02
from ttt;

0人赞
分享
二维码
赏一个