暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【SQL】Oracle中的排序函数

你的知识书架 2021-08-02
762

大家好呀,我是书架。


今天给大家带来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

文章转载自你的知识书架,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论