前言
Hive中也支持分析函数(也叫窗口函数)的使用,数据开发中使用分析函数的情况非常之多,可以极方便的得到想要的数据呈现,便于分析。
一、常用的分析函数
ROW_NUMBER() 从1开始,按照顺序,生成分组内记录的序列,不会产生重复排名,若根据排序条件有相同的,则进行随机排序。1 2 3 4 5…
RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位,1 2 2 4 5
DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位,1 2 2 3 4
二、分析函数的应用
1.两张数据表
数据如下:
表:articles
id title
1 法律
2 农业
3 科技
4 金融
表:visit_info
visitor dates id
张三 2020/11/20 1
张三 2020/11/22 1
李四 2020/11/25 2
张三 2020/11/21 3
李四 2020/11/23 1
王五 2020/11/26 1
李四 2020/11/27 4
王五 2020/11/28 2
2.需求场景
现在想要查询出访问量最高的两个title,打印出visitor,id和title信息
select p1.visitor
,p2.title
,p1.id
,p1.cnt1
from (select t.visitor,
t.id,
t.cnt1,
dense_rank() over(order by cnt1 desc) as rn
from (select visitor, id, count(1) over(partition by id) as cnt1
from visit_info) t) p1
left join articles p2
on p1.id = p2.id
where p1.rn <= 2;
查询结果:
visitor title id cnt1
王五 法律 1 4
张三 法律 1 4
张三 法律 1 4
李四 法律 1 4
王五 农业 2 2
李四 农业 2 2
可以简单验证,id为1的访问量有四条,id为2的有两条,其他只有一条,所以访问量最高的就是id为1和2,即title为法律和农业的,同时带出visitor 和 title 即可。
附上几个相关的博文:
https://blog.csdn.net/sunnyyoona/article/details/56484853
https://blog.csdn.net/cnham/article/details/6101199