row_number() over、rank() over、dense_rank() over
- 分组排序:row_number()over()
- 跳跃排序:rank() over()
- 连续排序:dense_rank() over()
演示数据

row_number()over()
格式:row_number()over(partition by 分组字段 order by 排序字段 desc)
row_number()over()函数是根据分组字段进行分组,之后以组为单位,每组的数据再根据排序字段排序。over()里面的分组和排序的执行会晚于where group by order by的执行。
select name,subject,score,row_number() over(partition by subject order by score desc) rn from stu_gradle;

如果排序的字段有null值,空值是最大的。若想把空值控制为最小值,可使用nulls last,其他三个函数同理
select name,subject,score,row_number() over(partition by subject order by score desc nulls last) rn from stu_gradle;

rank() over()
格式:rank()over(partition by 分组字段 order by 排序字段 desc)
row_number()over()函数可以理解为跳跃排序,特点是同一门科目,相同成绩是并列排序的,但是不会空出名次,名次3和名次4并列第3,名次5是从第5开始。
select name,subject,score,rank() over(partition by subject order by score desc) rn from stu_gradle;

dense_rank() over()
格式:dense_rank()over(partition by 分组字段 order by 排序字段 desc)
dense_rank()over()函数可以理解为连续排序,与row_number()over()类似,不同点在于结果是连续的,比如名次3和名次4并列第3,但是名次5就是从第4开始
select name,subject,score,dense_rank() over(partition by subject order by score desc) rn from stu_gradle;


浙公网安备 33010602011771号