排名函数row_number()、 rank()、 dense_rank()、ntile()、partition by的区别及具体用法示例

1、为省时间,给同学们先看结论:

  1. row_number()排序相同时不会重复,会根据顺序排序;排名举例:1、2、3、4;
  2. rank()排序相同时会重复总数不变;排名举例:1、2、2、4;
  3. dense_rank()排序相同时会重复总数会减少;排名举例:1、2、2、3;
  4. ntile()确认最高排名,最高排名需要小于等于总数;排名举例ntile(N):1、2、3...N;
  5. partition by先分组,再进行组内排名

2、 背景交代:

  1. 教学数据库为Oracle数据库;
  2. 为方便教学创建一张学生分数表student_score,并插入数据;
CREATE TABLE ESHARE_DW.student_score ( 
id VARCHAR ( 10 ) NOT NULL, 
name VARCHAR ( 20 ) NOT NULL, 
score NUMBER ( 32 ) NOT NULL );


insert into ESHARE_DW.student_score(id,name,score) values(1,'赵子龙',95);
insert into ESHARE_DW.student_score(id,name,score) values(2,'马超',80);
insert into ESHARE_DW.student_score(id,name,score) values(3,'关羽',95);
insert into ESHARE_DW.student_score(id,name,score) values(1,'诸葛亮',100);
insert into ESHARE_DW.student_score(id,name,score) values(2,'阿斗',60);
insert into ESHARE_DW.student_score(id,name,score) values(3,'刘备',80);

SELECT * FROM student_score

数据如下:

3.1、 ROW_NUMBER (连续排名)

功能

  • 一般可以用来实现分页;
  • 他会为查询出来的每一行记录生成一个序号,依次排序且不会重复;
  • 注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号;

用法:

SELECT
	ss.ID,
	ss.NAME,
	ss.SCORE,
	ROW_NUMBER ( ) OVER ( ORDER BY ss.SCORE DESC ) ROW_NUMBER 
FROM
	STUDENT_SCORE ss

结果如下:

3.2、 rank()  (并列跳跃排名)

功能:

  • 对于同值元组,排名序号相同。
  • 但所有相同的元组各自为组,即对别的元组来说影响都是多元的。

用法:

SELECT
	ss.ID,
	ss.NAME,
	ss.SCORE,
	RANK ( ) OVER ( ORDER BY ss.SCORE DESC ) RANK
FROM
	STUDENT_SCORE ss;

结果:

3.3 DENSE_RANK (并列连续排名)

 功能:

  • 对于同值元组,排名序号相同。
  • 且所有相同的元组算作一组,即对别的元组来说影响都是一元的。

用法:

	SELECT
	ss.ID,
	ss.NAME,
	ss.SCORE,
	dense_rank() OVER ( ORDER BY ss.SCORE DESC ) dense_rank
FROM
	STUDENT_SCORE ss;

结果:

3.4 NTILE() (分组排名)

 功能:

  • 按指定列将所有记录分成指定个数的组,每一组序号相同,但组内元组指定的列可能不同;
  • 相当于按指定列先排序,再按长度截断分组;
  • NTILE()  括号内为长度参数

用法:

	SELECT
	ss.ID,
	ss.NAME,
	ss.SCORE,
	NTILE(4) OVER ( ORDER BY ss.SCORE DESC ) NTILE
FROM
	STUDENT_SCORE ss;

结果:

3.5 PARTITION BY(组内排序)

 功能:

  • 按照某字段分组;
  • 并在组内进行row_number()、 rank()、 dense_rank()、NTILE()排序;

用法:

SELECT
	ss.ID,
	ss.NAME,
	ss.SCORE,
	RANK() OVER ( partition by ID ORDER BY ss.SCORE DESC ) RANK_PARTITION
FROM
	STUDENT_SCORE ss;

结果:

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值