大家好呀,我是书架。
今天给大家带来Oracle中的函数rank()以及dense_rank(),这个函数特别适用于各种场景的统计查询。
为了理解这两个函数,首先给出后用例中需要的表数据。
select * from score

下面通过一个例题来理解这两个函数。
例题:将score表中的数据按照分数从高至低排名,并给出排名序号。
采用rank()函数SQL:
select s.*, rank() over(order by s.grade desc) rnk from score s

通过查询出的数据可知,将表中的数据按照分数降序输出并且给出了成绩排名序号。
小夫的语文成绩以94分勇夺第一。
而这一结果是通过rank()结合over()实现的,over()函数中放入需要排序的字段。
如果将上述ran()换成dense_ran(),那么SQL如
select s.*, dense_rank() over(order by s.grade desc) rnk from score s

通过rank()和dense_ran()查询对比,dense_ran()的排序出来的rnk字段是连续的,从1到11。
ran()的排序结果是不连续的从1到12,造成这一现象的原因是胖虎的数学和静香的语文成绩相同,都排名第九,但是rank()函数下一个排序会从11开始排,dense_rank()会从10开始排。
上述例题介绍了两个函数的用法和区别,下面再介绍一个需要分组的用法。
依然通过例题来感受:
将score表中的数据按照学科分组后并且以分数从高至低排名,并给出排名序号。
SQL如下:
select s.*, dense_rank() over(partition by subject order by s.grade desc) rnk from score s

通过查询结果可以发现按照学科分组后,每个学科中都有排名。
实现这个效果的方式是在over()函数中加入partition by 分组字段。
END




