Hive11_Rank函数

Rank

1)函数说明

RANK() 排序相同时会重复,总数不会变
DENSE_RANK() 排序相同时会重复,总数会减少
ROW_NUMBER() 会根据顺序计算

2)数据准备

Hive11_Rank函数_第1张图片

3)需求

计算每门学科成绩排名。

4)创建本地 score.txt,导入数据

[root@localhost datas]$ vi score.txt
孙悟空	语文	87
孙悟空	数学	95
孙悟空	英语	68
大海	语文	94
大海	数学	56
大海	英语	84
宋宋	语文	64
宋宋	数学	86
宋宋	英语	84
婷婷	语文	65
婷婷	数学	85
婷婷	英语	78

5)创建 hive 表并导入数据

create table score(
name string,
subject string, 
score int) 
row format delimited fields terminated by "\t";
load data local inpath '/usr/soft/datas/score.txt' into table score;

6)按需求查询数据

6.1 按照全部分数排序

select * , rank() over(order by score) from score;  

Hive11_Rank函数_第2张图片

select * , dense_rank() over(order by score) from score;

Hive11_Rank函数_第3张图片

select * , row_number() over(order by score) from score;

Hive11_Rank函数_第4张图片

6.2 按照学科排序

select * ,rank() over(partition by subject order by score desc) from score;
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;
name	subject	score	rp	drp	rmp
孙悟空	数学	95	1	1	1
宋宋	数学	86	2	2	2
婷婷	数学	85	3	3	3
大海	数学	56	4	4	4
宋宋	英语	84	1	1	1
大海	英语	84	1	1	2
婷婷	英语	78	3	2	3
孙悟空	英语	68	4	3	4
大海	语文	94	1	1	1
孙悟空	语文	87	2	2	2
婷婷	语文	65	3	3	3
宋宋	语文	64	4	4	4

扩展:求出每门学科前三名的学生?

select
	name,subject,score
from
	(select
    	*, rank() over(partition by subject order by score desc)rk
     from score) t1
where rk<=3;
     

``
Hive11_Rank函数_第5张图片

你可能感兴趣的:(hive,hive,大数据,hadoop,数据仓库)