赞
踩
在hive的学习中接触到了三种很实用的排名函数,这些函数在Mysql8.0版本中也已存在,
分别是:Rank(),Dense_rank(),Row_number(),
虽然都是排名函数,但三者间的些许差异很容易让人搞混,在这篇文章中,我将基于hive结合一个学生成绩排名的例子来对这三种排名函数进行解释与辨析。
进行学生表的创建以及样例数据的导入
create table stu(sno varchar(5),score int) row format delimited fields terminated by ',';
load data local inpath '/opt/module/data/stu_score.txt' into table stu;
查看学生表:
从数据中可以看出,s01,s03,s06号学生的成绩相同,本文要介绍的这三种排名函数的主要差异就是在对相同成绩的排名时采用不同的处理办法,以至于得到不同的结果。
接下来就是根据具体例子对三种函数进行讲解。
Rank()函数可以根据指定的字段来排序,排序时如果遇到排名字段值相同的情况时,会将相同的归为一组,也就是值相同,排名就是相同的,后面的排名会顺延,总排名数是不会改变的。
举一个例子:Rank()函数排序可以理解为:每个人先根据成绩高低从左到右坐好座位,座位上先根据人数标好连续的序号,成绩相同的人座位的序号都改为成绩相同的第一个人的座位序号,后面的人座位的的序号还是原来排好的,不会改变。
使用Rank()函数根据score字段对stu表进行降序排序的sql语句:
select sno,score,rank() over (order by score desc) from stu;
如下图所示,s01,s03,s06号学生成绩都是90分,使用Rank()排名时,他们三个人都是第二名,最后一名s05因为排名顺延,最终排名是第六,即总排名数是不会改变的,总共有六个人,总排名数就是六。
Dense_rank()函数可以根据指定的字段来排序,排序时如果遇到排名字段值相同的情况时,会将相同的归为一组,后面的接着前面的排序序号。
Dense_rank()函数与Rank()函数的不同点在于:即使存在相同字段值的话,排名也不是跳跃的,Dense_rank()函数进行的排名是连续的。也就是相比于Rank()函数,Dense_rank()函数的总排名数会减少。
举一个例子:Dense_rank()函数排序可以理解为:每个人先根据成绩高低从左到右坐好座位,座位上根据人数标好连续的序号,成绩相同的人座位的序号都改为成绩相同的第一个人的座位序号,后面的人座位的的序号接着前面的人的序号而改变,不保持原来的序号。
使用Dense_rank()函数根据score字段对stu表进行降序排序的sql语句:
select sno,score,dense_rank() over (order by score desc) from stu;
如下图所示,s01,s03,s06号学生成绩都是90分,使用Dense_rank()排名时,他们三个人都是第二名,s04成为第三名,最后一名s05排名最终排名是第四,即总排名数因为有成绩相同的学生而减少。
Row_number()函数可以根据指定的字段来排序,Row_number()函数比较直接,排好名后,排名序号就是从上到下连续的,比较容易理解。
再举一个例子:Row_number()函数排序可以理解为:每个人先根据成绩高低从左到右坐好座位,座位上根据人数标好连续的序号,就可以了。
使用Row_number()函数根据score字段对stu表进行降序排序的sql语句:
select sno,score,row_number() over (order by score desc) from stu;
如下图所示,s01,s03,s06号学生成绩都是90分,使用Row_number()排名时,他们三个人分别是第二第三第四名,没有出现相同排名的情况,最后总排名数与人数相同。
不论是在学习工作中还是面试中,hive中排名函数的使用都是一个十分重要的点,应该牢牢掌握。
后续会总结出排名函数有关的题目与解答,供大家参考。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。