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

开窗函数的关键字是 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;

下面这张图时没有限制取前三的时候的查询结果集
Hive的开窗函数小结以及利用排名函数查询topN例子_第1张图片
限制 t.rank <= 3后的查询结果集,可以看到已经成功查询出每个科目成绩前三的学生信息
Hive的开窗函数小结以及利用排名函数查询topN例子_第2张图片

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