oracle中的RANK()、ROW_NUMBER()、DENSE_RANK()区别和使用

本文详细介绍了SQL中的三种排名函数:ROW_NUMBER(), RANK() 和 DENSE_RANK() 的使用方法及区别,并通过具体示例展示了如何利用这些函数查询成绩表中各科成绩的前三名。

上次的面试除了算法不好,就连数据库的查询都忘了很多,或者说当时就没学多少吧最近就刷了一下数据库的查询,有一题是求各个科目的前三名同学的信息及分数。所以使用到排名RANK()、ROW_NUMBER()DENSE_RANK()这三个都是和排名有关的,但是在排序的时候会有些出入。

ROW_NUMBER()

没有重复数据(100、99、98...)时依次排1、2、3...,

遇到重复的数据时(100、100、99、99、98...)时依然排(1、2、3、4、5...)

小结:重复与不重复时都是连续的排序,重复的值谁的排名在前就看查出来的结果谁在前

 

RANK()

没有重复数据(100、99、98...)时依次排1、2、3...,

但遇到重复的数据时(100、100、99、99、98...)时依次排(1、1、3、3、5...)

小结:数据重复时,值相同的排名并列,下一个不同值的排名等于前面数量加一(所以排名会出现不连续)

 

DENSE_RANK()

没有重复数据(100、99、98...)时依次排1、2、3...,

但遇到重复的数据时(100、100、99、99、98...)时依次排(1、1、2、2、3...)

小结:数据重复时,值相同的排名并列,下一个不同值的排名紧接上一个排名

 

总结:

ROW_NUMBER()排名连续、不会有排名并列

DENSE_RANK()排名连续、会有排名并列

RANK()排名会出现不连续、会有排名并列


补充:

有个成绩表sc,字段有课程编号(c_id),学生编号(s_id),成绩(score)

查询出各科成绩的前三名

select * from 
	(select 
		rank() over(partition by c_id order by score desc) 名次,    --根据c_id分组,score降序排序
		c_id 课程编号,
		s_id 学生编号,
		score 成绩
	from sc)a 
where a.名次<=3;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值