Hive的开窗函数小结以及利用排名函数查询topN例子

13 篇文章 1 订阅
7 篇文章 0 订阅

开窗函数的关键字是 over,一般用在聚合函数的后面

开窗函数与group by 的比较

开窗函数用于计算基于组的某种聚合值,并且对每个组返回多行,但是group by 一个组只返回一行

over() 不加参数,窗口大小为所有行
over(partition by 字段) 窗口大小为所在分区的大小
over(partition by 字段 order by 字段 [asc/desc]) 窗口大小为分区内的第一行一直到当前行
over(distribute by 字段 sort by 字段 [asc/desc]) 待思考

相应的窗口函数(需配合 over() 使用):

ntile(数值) over(…)
对窗口所在行按顺序进行切片,并返回切片值(第几片),可以用于按比例查询数据,需要将切片的结果作为子表实现按比例查询

LAG(字段,数值n,默认值) over(…)
返回当前窗口数据行前面的第n行,选择的默认值为当不存在当前数据行前面的第n行时,返回的值

LEAD(字段,数值n,默认值) over(…)
返回当前窗口数据行后面的第n行,选择的默认值为当不存在当前数据行后面的第n行时,返回的值

first_value(字段) over(…)
返回当前窗口的第一行的值

last_value(字段) over(…)
返回当前窗口第一行到当前行的记录中最后一行的值

排名函数:对窗口内的行按顺序显示排名,具体排名时选择哪个,还是看需求
row_number() over(partition by 字段 order by 字段)
row_number() over(distribute by 字段 sort by 字段)
遇到值相同时,排名不重复(没有并列的名次),继续向下递增
类似 1 2 3 4 5

rank() over(partition by 字段 order by 字段)
rank() over(distribute by 字段 sort by 字段)
值相同时,排名相同(排名并列),但是下面的排名会跳过,类似 1 2 2 4 5

dense_rank() over(partition by 字段 order by 字段)
dense_rank() over(distribute by 字段 sort by 字段)
值相同时,排名并列,下面的排名不会跳过,类似 1 2 2 3 4 5

可以利用排名函数达到取得topN的效果,注意topN的情况需要降序排序

//数据准备
zhangsan	chinese	95
zhangsan	english	88
zhangsan	math	89
zhangsan	biology	77
lisi	english	76
lisi	math	99
lisi	chinese	84
lisi	biology	79
wangwu	english	70
wangwu	chinese	81
wangwu	math	92
wangwu	biology	74
guojing	chinese	99
guojing	math	71
guojing	biology	96
guojing	english	69
hanxin	chinese	93
hanxin	math	45
hanxin	english	66
hanxin	biology	83

-- 创建表stu
drop table if exists stu;
create table if not exists stu(
	name string,
	subject string,
	score int
)
row format delimited fields terminated by '\t'
lines terminated by '\n'
;

-- 加载数据到表stu
load data local inpath '/root/stu.csv' overwrite into table stu;

-- 对按科目进行排名,查询出每个科目成绩前三名
select name, subject, score
from (
         select name, subject, score, dense_rank() over (partition by subject order by score desc) as rank
         from stu
     ) t
where t.rank <= 3;

下面这张图时没有限制取前三的时候的查询结果集
在这里插入图片描述
限制 t.rank <= 3后的查询结果集,可以看到已经成功查询出每个科目成绩前三的学生信息
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值