函数说明
- rank() 排序相同时会重复,总数不会变
- dense_rank() 排序相同时会重复,总数会减少
- row_number() 会根据顺序计算
这三个函数很经常使用,也很经常被混淆,在面试中也是常常被提及,下面提供一个案例来帮助理解,以及最后用一点小思维帮助大家记忆区分。
案例:
1)数据准备
2)需求
计算每门学科成绩排名。
3)创建本地score.txt,导入数据
[ysh@hadoop102 datas]$ vi score.txt
4)创建hive表并导入数据
create table score(
name string,
subject string,
score int)
row format delimited fields terminated by "\t";
load data local inpath '/opt/module/datas/score.txt' into table score;
5)按需求查询数据
select name,
subject,
score,
rank() over(partition by subject order by score desc) rp,
dense_rank() over(partition by subject order by score desc) drp,
row_number() over(partition by subject order by score desc) rmp
from score;
6)结果展示
可以这么理解:
- rank(),是有间隔的排名,有并列排名的时候,下一个排名会间隔(并列数-1)个数
- dense_rank(),dense(密集的),有并列排名的时候下一个排名紧接上一个并列的排名
- row_number(),可以理解为行的序号,不考虑并列排名(因为没有rank)
记忆:“没有rank按顺序,只有rank有间隔,dense是密集的”