HiveSQL核心技能之窗口计算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HiveSQL核心技能之窗口计算相关的知识,希望对你有一定的参考价值。

参考技术A

目标:
1、掌握 sum()、avg()等用于累计计算的聚合函数,学会对行数的限制(移动计算);
2、掌握 row_number(),rank()、dense_rank()用于排序的函数;
3、掌握 ntile()用于分组查询的函数;
4、掌握 lag()、lead()偏移分析函数

窗口函数(window function):
与聚合函数类似,但是窗口函数是每一行数据都生成一个结果,聚合函数可以将多行数据按照规定聚合为一行,一般来说聚合后的行数要少于聚合前的行数,但是有时我们想要既显示聚合前的数据,又要显示聚合后的数据,这时便引入了窗口函数, 窗口函数是在 select 时执行的,位于 order by 之前

在日常工作中,经常遇到 计算截止某月或某天的累计数值 ,在Excel可以通过函数来实现,
在HiveSQL里,可以利用窗口函数实现。

1)2018年每月的支付总额和当年累计支付总额

2)对2017年和2018年公司的支付总额按月度累计进行分析,按年度进行汇总

说明:1、over中的 partition by 起到分组的作用;
2、order by 按照什么顺序进行累加,升序ASC、降序DESC,默认升序
3、正确的分组是非常重要的,partition by 后面的字段是需要累计计算的区域,需要仔细理解

(计算三日留存、七日留存、三十日留存等方式可以使用这个函数。)

3)对2018年每个月的近三个月进行移动的求平均支付金额

用法:这三个函数的作用都是返回相应规则的排序序号,由于排序函数不是二次聚合计算,因此不一定要使用子查询

4)2019年1月,用户购买商品品类数量的排名

5)选出2019年支付金额排名在第10、20、30名的用户

6)将2019年1月的支付用户,按照支付金额分成5组

7)选出2019年退款金额排名前10%的用户

说明:Lag和Lead分析函数可以在同一次查询中取出同一字段的 前N行数据(Lag)和后N行的数据(Lead) 作为独立的列。

在实际应用当中,若要用到取今天和昨天的某字段差值时,Lag和Lead函数的应用就显得尤为重要。
当然,这种操作可以用表的 自连接实现 ,但是Lag和Lead与 left join、 right join等自连接相比,效率更高,SQL语句更简洁。

8)支付时间间隔超过100天的用户数(这一次购买距离下一次购买的时间?,注意datediff函数是日期大的在前面)

9)每个城市,不同性别,2018年支付金额最高的TOP3用户

步骤总结:
1、首先筛选出每个用户和每个用户总的消费金额;
2、对两个表进行连接提取需要的字段;
3、对连接后的表进行二次聚合计算,计算出不同城市、性别的金额排名;
4、对二次聚合计算的表进行条件筛选提取

10)每个手机品牌退款金额前25%的用户

步骤总结:
1、首先筛选出每个用户和每个用户的总退款金额;
2、对两个表进行连接提取需要的字段;
3、对连接后的表进行按手机品牌内分组;
4、对分组后的表进行条件筛选提取

以上是关于HiveSQL核心技能之窗口计算的主要内容,如果未能解决你的问题,请参考以下文章

HiveSQL核心技能之常用函数

数据分析课程笔记 - 20 - HIVE 核心技能之窗口函数

大厂面试之JAVA核心技能:Slipped Conditions

一篇文章了解架构师的核心技能

大厂面试之JAVA核心技能:Slipped Conditions

大厂面试之JAVA核心技能:Slipped Conditions