有如下数据:
孙悟空,语文,87
孙悟空,数学,95
孙悟空,英语,68
沙悟净,语文,94
沙悟净,数学,56
沙悟净,英语,84
宋松松,语文,64
宋松松,数学,86
宋松松,英语,84
罗婷婷,语文,65
罗婷婷,数学,85
罗婷婷,英语,78
需求:查询每科成绩的排名
分析:rank():分数相同,不去掉数据(并排,假设有2、3分数相同,都排第二名,下面一个就是第四名,没有第三)
dense_rank():分数相同,则去掉(并排,下面的数据+1)
ROW_NUMBER() :不并排,假设二三分数相同,依然会排出第二名、第三名
具体看英语成绩的排名:
-- 建表
create table score(
name string,
subject string,
score int)
row format delimited
fields terminated by ",";
--插数据
load data local inpath "/usr/local/src/test4/hive/score.txt" into table score;
查询:
select * ,
RANK() over(partition by subject order by score desc) rank,
DENSE_RANK() over(partition by subject order by score desc) dense_rank ,
ROW_NUMBER() over(partition by subject order by score desc) row_num
from score;
res:
+-------------+----------------+--------------+-------+-------------+----------+--+
| score.name | score.subject | score.score | rank | dense_rank | row_num |
+-------------+----------------+--------------+-------+-------------+----------+--+
| 孙悟空 | 数学 | 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 |
+-------------+----------------+--------------+-------+-------------+----------+--+