虚拟机 中hive中的数据导入mysql_MySQL和Hive中的排名问题

46b62b002b0815b263c4ed0c823cd793.png

MySQL作为最常用的数据库管理语言之一,在使用过程中经常会遇到排名问题,下面就来梳理一下MySQL排名情况。

先建立score表,插入数据

create table score values(student_id int,class int,score int);
insert into score(student_id,class,score) VALUES
(1,1,98),
(2,1,76),
(3,1,98),
(4,1,60),
(5,2,88),
(6,2,76),
(7,2,98),
(8,2,45),
(9,3,23),
(10,3,97),
(11,3,94),
(12,3,65)

查看数据

a554d93d81820eaa1879d9dacb70a2ce.png

问题1:不考虑是否有分数相同的情况,对每个分数进行从高到底排名,即同样的分数可以名次不一样。

解答:不考虑分数相同的情况下,即只要按照分数从高到底排好序之后统计行号就能达到目的。

SELECT a.*,(@rownum:=@rownum +1) as rank from score as a,(SELECT (@rownum:=0)) as b 
order by a.score desc

得到结果如下,三个98分分别是第1, 第2,第3名,名次总数等于行数。

33d00523920d33b70a3d06836d8edec8.png

问题2:考虑分数相同的情况,比如3个98分相同时,排名不变,当分数不同时,排名增加1,即接下来的97分是第2名。

解答:理解排名的含义,第N名其实就是有N-1个分数(前N-1名的分数,不重复)比我的分数高

SELECT a.*,(SELECT COUNT(distinct b.score) FROM score as b where a.score<b.score) +1 as rank
from score as a
ORDER BY a.score DESC

结果如下,12个分数有3个是与其他重复的,因此只有9个名次。

fac04b646f497fac0c0b2eae38584a70.png

问题3:考虑分数相同的情况,比如3个98分相同时,排名不变,但是会占据一个位置,当分数不同时,比如接下来的97分是第4名。

解答:这里跟问题2的区别在于,问题2是根据的分数是可以重复的,而这里的分数是不能重复的。即:第N名是前面有N-1个人的分数(哪怕前N-1个人的分数是一样的)比我高。因此,这里只需要将问题2中的SQL语句中的distinct去掉即可。

SELECT a.*,(SELECT COUNT(b.score) FROM score as b where a.score<b.score) +1 as rank
from score as a
ORDER BY a.score DESC

结果如下,可以看出第2,第3名是缺失的,被另外两个98分占据了。

16288f9c3b8e840defb28ee5e7d118ff.png

Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。

Hive提供了窗口函数,以上问题可以通过窗口函数来解决。

进入Hive,首先一样是建表,插入数据,查询数据结果如下:

874c1b33c85fd8d8cc468e4b3d027b47.png

对应上面的3种排名问题,Hive分别有三个窗口函数:

row_number():按照顺序,从1开始,row_number()的值不会重复,当排序值相同时会按照表中的顺序进行排列。

rank():值相同时排名一样,会留下空位。

dense_rank():dense,密集的意思。值相同时排名一样,不会留下空位。

Hive执行如下语句:

select *,
   row_number() over (order by score desc) as row_num,
   rank() over (order by score desc) as ranking,
   dense_rank() over (order by score desc) as dense_ranking 
from score;

结果如下,row_num, ranking, dense_ranking同时查询出来了。

4060ff2c9416b0259367794dff2ddabf.png

当然,Hive的这几个窗口函数还经常被用在分组排名上面。

如根据以上几个窗口函数按照班级分组再排名一次,则只需要在order by score desc的前面加上partition by class 就好。

select *,
   row_number() over (partition by class order by score desc) as row_num,
   rank() over (partition by class order by score desc) as ranking,
   dense_rank() over (partition by class order by score desc) as dense_ranking 
from score;

结果如下

def0c19a4357833f51270f859ac8cb5b.png

窗口函数在分组排名是确实非常好用,省去了在MySQL写一些比较长的条件判断、赋值语句,也能极大地方便查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值