Oracle中rank() over,dense_rank() over,row_number() over的区别

1.rank() over:

Rank() over 用于指定条件后的进行排名.特点是对指定栏位的排名可以使用本函数,因为,如果出现两个相同的值,它会将其分为一组,同时将下一个栏位所占名次空出来

使用方法:rank() over(partition by 分组栏位名 order by 排序栏位名 desc)

例:

select name,subject,score,rank() over(partition by subject  order by score  desc) rank from student_score;


Oracle中rank() over,dense_rank() over,row_number() over的区别_第1张图片

2.dense_rank() over:

dense_rank() over 与 rank() over的区别:前者并不会空出所占栏位数(也就是两个数值同用一个栏位数,那么下一个不同数值将占用前一个数值的栏位数),后者继续依照栏位数往下依次排列(栏位虽然并列,但是并列后的栏位会空出)

使用方法:dense_rank() over(partition by 分组栏位名 order by 排序栏位名 desc)

例:

select name,subject,score,dense_rank() over(partition by subject order by score desc) rankfrom student_score;


Oracle中rank() over,dense_rank() over,row_number() over的区别_第2张图片

3.row_number() over:

row_number() over这个函数不需要考虑是否并列,哪怕根据条件查询出来的数值相同也会进行连续排列

使用方法:row_number() over(partition by 分组栏位名 order by 排序栏位名 desc)

例:

select name,subject,score,row_number() over(partition by subject order by score desc) rankfrom student_score;


Oracle中rank() over,dense_rank() over,row_number() over的区别_第3张图片

注意:使用rank() over时,假如数据中有" NULL"存在,那么NULL是最大的,可能会造成NULL字段排在最前面,影响排序结果.可以这样:rank() over(partition by course order by score desc nulls last)来规避这个问题

你可能感兴趣的:(Oracle中rank() over,dense_rank() over,row_number() over的区别)