文章目录
首先rank() 是一个排名函数,
函数说明
rank() 排名的时候,排序相同会重复,但总数不变
dense_rank() 排序相同时会重复,但是总数会减少
row_number() 会根据顺序计算,值一样,也不会出现重复排序
数据准备
name | subject | score |
---|---|---|
孙悟空 | 语文 | 87 |
孙悟空 | 数学 | 95 |
孙悟空 | 英语 | 68 |
大海 | 语文 | 94 |
大海 | 数学 | 56 |
大海 | 英语 | 84 |
宋宋 | 语文 | 64 |
宋宋 | 数学 | 86 |
宋宋 | 英语 | 84 |
婷婷 | 语文 | 65 |
婷婷 | 数学 | 85 |
婷婷 | 英语 | 78 |
需求
计算每门学科成绩排名。
创建本地 score.txt,导入数据
vim score.txt
孙悟空 语文 87
孙悟空 数学 95
孙悟空 英语 68
大海 语文 94
大海 数学 56
大海 英语 84
宋宋 语文 64
宋宋 数学 86
宋宋 英语 84
婷婷 语文 65
婷婷 数学 85
婷婷 英语 78
创建 hive 表并导入数据
create table score(
name string,
subject string,
score int)
row format delimited fields terminated by "\t";
load data local inpath '/opt/hive/data/score.txt' into table score;
按需求查询数据
select
t1.name,
t1.subject,
t1.score,
rank() over(partition by t1.subject order by t1.score desc) rank1,
dense_rank() over(partition by t1.subject order by t1.score desc) rank2,
row_number() over(partition by t1.subject order by t1.score desc) rank3
from
score t1;
rank() 方式查询
select *,rank() over(partition by subject order by score desc) as rank from score;
结果如下
我们发现,英语部分,有两个相同的分数,大海和松松,英语84,并列第一,且宋宋在大海的后面,发现rank 排名, 宋宋后面的婷婷,直接是第三,由此得知,rank() 是跳跃式排名,总数保持不变
dense_rank() 方式查询
select *,dense_rank() over(partition by subject order by score desc) as rank from score;
结果如下
由此图可发现,英语科目,大海和宋宋还是并列第一,但是婷婷却变成了第二,孙悟空第三,
由此可见,dense_rank() 函数 ,非跳跃式排名,影响了总数,因为一共四个人,却成了三个
row_number() 查询
select *,row_number() over(partition by subject order by score desc) as rank from score;
结果如下
我们看到 大海和宋宋,英语虽然都是 84分,但是两人却排了名次, 第一和第二,由此可见,row_number() 会根据顺序计算,值一样,也不会出现重复排序,