我们直接来动手实验吧,原理性的描述可以网上百度。
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;