军事院校排名函数笔记软件很多朋友对这方面很关心,金博宝188官网整理了相关文章,供大家参考,一起来看一下吧!
大家好呀,这节课我们学习 Hive 核心技能中最难的部分——窗口函数。窗口函数我们之前在学 MySQL 的时候有学过一些,但是只学了三个排序的窗口函数。这节课我们会学习更多的窗口函数,包括累计计算、分区排序、切片排序以及偏移分析。
在正式学习之前,我们需要先明纳顷戚确一下窗口函数和GROUP BY分组的区别。二者在功能上有相似之处,但是它们存在本质区别。
1. 分组会改变表的结构,而窗口函数不会改变表的结构。比如原表有10行数据,分成两组后只有两行,而窗口函数仍然返回十行数据。
2. 分组只能查询分组后的字段,包括分组字段(组名)和聚合函数字段。而窗口函数对查询字段没有限制,也就是可以查询原表的任意字段,再加上窗口函数新增的一列值。
好啦,现在让我们一起进入窗口函数的世界吧~
本节课主要内容:
1、洞陵累计计算窗口函数
(1)sum(…) over(……)
(2)avg(…) over(……)
(3)语法总结
2、分区排序窗口函数
(1)row_number()
(2)rank()
(3)dense_rank()
3、切片排序窗口函数
(1)ntile(n) over(……)
4、偏移分析窗口函数
5、重点练习
大家在做报表的时候,经常会遇到计算截止某月的累计数值,通常在EXCEL里可以通过函数来实现。
那么在HiveSQL里,该如何实现这种累计数值的计算呢?那就是利用窗口函数!
关于窗口函数的几点说明:
需求分析:既然要进行按月乎行累计,我们就先要把2018年的每笔交易时间转换成月并按月分组聚合计算,得出一个2018年每月支付金额总合表,再基于这张表用窗口函数进行累计计算。
2018年每月支付金额总和表:
再用窗口函数进行月度累计:
年度进行汇总。
这个需求比需求1多了一个需求,那就是年度汇总。那我们只需要在上个需求的子查询中加一个 year 字段即可。
说明:
1、over 中的 partition by 起到了窗口内将数据分组的作用。事实上,加上partition by之后,可以理解为分成了多个窗口,并在每个窗口内进行累加计算或者分区。
如果不加 partition by a.year 的话,运行结果就是这样单纯按月份进行分组的:
2、order by 按照什么顺序进行累加,升序ASC、降序DESC,默认是升序。
大家看股票的时候,经常会看到这种K线图,里面经常用到的就是7日、30日移动平均的趋势图,那如何使用窗口函数来计算移动平均值呢?
需求分析:这个需求要求每个月近三个月的移动平均支付金额,这里我们要用到一个新知识点,在窗口函数 avg over 的 order by a.month 之后加一句 rows between 2 preceding and current row 来设定计算移动平均的范围,这个语句的含义就是包含本行及前两行。其他部分的写法跟前面的需求类似,先取出2018年每个月的支付金额总和,再用窗口函数求移动平均。
注意:
sum(…A…) over(partition by …B… order by …C… rows between …D1… and …D2…)
avg(…A…) over(partition by …B… order by …C… rows between…D1… and …D2…)
A:需要被加工的字段名称
B:分组的字段名称
C:排序的字段名称
D:计算的行数范围
rows between unbounded preceding and current row
——包括本行和之前所有的行
rows between current row and unbounded following
——包括本行和之后所有的行
rows between 3 preceding and current row
——包括本行以内和前三行
rows between 3 preceding and 1 following
——从前三行到下一行(5行)
max(……) over(partition by …… order by …… rows between ……and ……)
min(……) over(partition by …… order by …… rows between ……and ……)
row_number() 、rank()、dense_rank()
用法:这三个函数的作用都是返回相应规则的排序序号
row_number() over(partition by …A… order by …B… )
rank() over(partition by …A… order by …B… )
dense_rank() over(partition by …A… order by …B… )
A:分组的字段名称
B:排序的字段名称
注意:这3个函数的括号内是不加任何字段名称的!
row_number:它会为查询出来的每一行记录生成一个序号,依次排序且不会重复。
rank&dense_rank:在各个分组内, rank() 是跳跃排序,有两个第一名时接下来就是第三名, dense_rank() 是连续排序,有两个第一名时仍然跟着第二名。
实例练习:
再眼熟一下 user_trade 的表结构:
需求分析:先限定时间范围,然后根据 user_name 进行分组,接着选出 分组去重后的 user_name,并计算每个用户 goods_category 的数量(记得 distinct 去重),再然后就是用窗口函数对 goods_category 的数量进行排序,当然选择哪一种排序方法要看具体要求,这里我们可以三种方法都试一下看看结果:
注意:窗口函数中的 order by 字段不能用 select 中字段的重命名,因为二者是同时执行的。
需求分析: 先用窗口函数将2019年每个用户的支付总金额算出来并进行排序,再以此作为子查询,从中取出排名在第10、20、30名的用户名、支付总金额以及排名次序。企业一般会使用 dense_rank 进行排序,所以我们这里直接用 dense_rank。
2019年每个用户的支付总金额排名:
2019年支付金额排名在第10、20、30名的用户:
ntile(n) over(partition by …A… order by …B… )
n:切分的片数
A:分组的字段名称
B:排序的字段名称
需求分析:这个需求很简单,把需求5第一步的排序窗口函数变成切片即可。注意时间筛选条件变成2019年1月。
需求分析: 排名前10%,也就是一共分成10组,取第1组。那么我们先切片分组:
然后再取第一组:
说明:Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。
在实际应用当中,若要用到取今天和昨天的某字段差值时,Lag和Lead函数的应用就显得尤为重要。当然,这种操作可以用表的自连接实现,但是LAG和LEAD与left join、right join等自连接相比,效率更高,SQL语句更简洁。
lag(exp_str,offset,defval) over(partion by ……order by ……)
lead(exp_str,offset,defval) over(partion by ……order by ……)
lag() 函数示例:
lead() 函数示例:
需求分析:先要从 user_trade 表中取出每个用户的支付时间,把每个用户放到一个窗口中,按照支付时间进行排序,取出偏移列: lead(dt,1,dt) over(partition by user_name order by dt)。接着基于该子查询,筛选出时间间隔大于100天的用户,并计算数量。
注意: 如果上面偏移分析函数写成 lead(dt,1,dt) 就不用加后面的 dt is not null 了,因为有默认值的话,间隔就是0,肯定是不满足条件的。
需求分析:
第一步:这个需求要用到 user_trade 和 user_info 两张表,前者取支付时间和金额,后者取城市和性别。先对这两张表基于 user_name 进行左连接,并取出相应字段,用窗口函数进行分组排序:
这一步的运行结果是这样的:
第二步:基于上述结果取出TOP3:
需求分析:
第一步:这个需求同样要用到两张表 user_refund 和 user_info。我们先把每个退款用户的退款金额和*品牌取出来,并用窗口函数进行切片排序,25%就是分成4片:
注意:这里之所以要加 WHERE dt is not null 是因为 user_refund 是一个分区表,分区表要对分区字段进行限制,否则 hive 会报错。
第二步:选择前25%,也就是第一片:
最后补充一个从 hive 导出结果数据的命令:
以上就是这节课的全部内容了。做完整个练习,真的半条命都没了。窗口函数果然很难,不过掌握方法、多多练习,学会拆解需求,一步一步来做,就能明显降低难度。希望以后有机会能用到这么复杂的技能,哈哈~!
以上就是金博宝188官网为大家带来的军事院校排名函数笔记软件,希望能帮助到大家!
军校是很多高考考生在填报志愿时的第一选择,随着社会不断发展,越来越多的年轻人投身于我国的军事事业,对
2020年07月09日 10:13军队院校排名一览表军队院校排名中国人民解放军国防科技大学、中国人民解放军海军军医大学、中国人民解放军
2023年10月07日 06:27今天,金博宝188官网小编为大家带来了军校专科学校排名分数线军事院校排名以及录取分数线,希望能帮助到广大考生和
2023年10月09日 18:27官网军事院校排名查询系统很多朋友对这方面很关心,金博宝188官网整理了相关文章,供大家参考,一起来看一下吧!部
2023年10月27日 17:03今天金博宝188官网小编整理了陕西省的军事院校排名相关信息,希望在这方面能够更好帮助到大家。陕西省有哪些军事类
2023年10月28日 10:17大学排名是很多朋友有关注的类型,那么军事类院校分数排名榜武汉,金博宝188官网为大家带来了相关文章,希望给大家
2023年10月28日 13:12对于大学排名比较关注的小伙伴们一定非常关心大连军事院校排名榜名单,今天金博宝188官网小编为大家整理了以下内容
2023年10月28日 13:54研究生院校排名550所很多朋友对这方面很关心,金博宝188官网整理了相关文章,供大家参考,一起来看一下吧!香港
2023年10月29日 09:56大学排名是很多朋友有关注的类型,那么军事院校排名及所在地,金博宝188官网为大家带来了相关文章,希望给大家提供
2023年10月29日 10:13山东省的军事院校排名很多朋友对这方面很关心,金博宝188官网整理了相关文章,供大家参考,一起来看一下吧!山东军
2023年10月29日 10:18沈阳航空航天大学分数线(沈阳市航空航天大学录取分数线)
时间:2024年03月01日化妆专业大学排名(化妆品专业大学排名)
时间:2024年03月01日2024年沈阳工业大学工程学院分数预测 沈阳工业大学分数线
时间:2024年03月01日铜梁有哪些大学
时间:2024年03月01日大连理工大学城市学院2023录取分数线 大连理工大学城市学院 分数线
时间:2024年03月01日三本大学排名榜 全国最好的三本学校 三本大学
时间:2024年03月01日武汉文科民办大学排名榜 武汉民办本科大学排名
时间:2024年03月01日武汉比较好的民办大学排名 武汉民办二本大学排名
时间:2024年03月01日正宗黑龙江三本大学排名 黑龙江最好的三本大学
时间:2024年03月01日民办大学排名最新排名(民办大学排名)
时间:2024年03月01日