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;

posted @ 2020-11-17 16:18  ForeverS2C  阅读(519)  评论(0)    收藏  举报