create table course_score(
course_name varchar2(4),-- 科目
user_name varchar2(4),-- 姓名
score number-- 成绩
);
插入的数据如下:
科目 姓名 成绩
数学 陈大 60
语文 陈大 48
英语 陈大 60
数学 王二 60
语文 王二 74
英语 王二 70
数学 张三 50
语文 张三 50
英语 张三 70
数学 李四 30
语文 李四 80
英语 李四 63
共12行数据;
select a.*,rownum from course_score a;
select a.*,rownum from course_score a order by score desc;
在order by之前rownum已经确定,order by无法改变排名(排名顺序都不能保证,就更没必要讨论相同值排名不同了);
row_number()函数
select a.*,row_number()over(order by score desc) 排名 from course_score a;
加partition()分区,分科目排名
相同值的排名会递增(相同成绩需要相同)
rank()函数
select a.*,rank()over(order by score desc) 排名 from course_score a;
加partition()
select a.*,rank()over(partition by course_name order by score desc) 排名 from course_score a;
rank()可以达到相同值排名相同,但排名相同的相当于会占位,后面的排名会跳号
dense_rank()
select a.*,dense_rank()over(order by score desc) 排名 from course_score a;
加partition()
select a.*,dense_rank()over(partition by course_name order by score desc) 排名 from course_score a;
dense_rank()可实现并列排名;
具体用row_number()、rank()、dense_rank()根据自己的实际情况进行选择;