Hive之聚合类开窗函数 + 滑动求和

为什么要写这样子一个主题文章呢,开窗函数毫无疑问,超级重要,但是很多人可能不会遇到一些稍微小众的业务需求,比如说滑动求和。这里带着业务,一并让大家熟悉一些,高阶函数的应用。

0,开窗函数和聚合函数的不同之处是什么?

◎普通的聚合函数用group by分组,
◎每个分组返回一个统计值,
◎而分析函数采用partition by分组,
◎并且每组每行都可以返回一个统计值。

一,聚合类开窗函数

1.1,基础语法

--语法格式是

 SUM  (字段1)   OVER  ( PARTITION BY 字段2  ORDER BY  字段3  desc/asc )

1.2,数据如下

A公司各部门员工的工资(24年6月)
部门 edptno员工 empno工资(元)SAL
AA0016K
AA0024K
AA0035K
CC1119K
CC1126.5K
CC1138K
CC1148.5K

1.3,代码如下

SELECT  
 E.DEPTNO    --部门
,E.EMPNO     --员工
,E.SAL       --工资
,SUM(E.SAL) OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL )  AS S1 --按部门累加 
,SUM(E.SAL) OVER(PARTITION BY E.DEPTNO)  AS S2 --部门总和
,SUM(E.SAL) OVER(ORDER BY E.SAL)  AS S3  --全公司工资累加
,SUM(E.SAL) OVER()  AS S4  --公司工资总和 
FROM EMP E ;

1.4,结果展示

A公司各部门员工的工资(24年6月)
部门 edptno员工 empno工资(元)SAL

S1

按部门累加

S2

部门总和

S3

全公司工资累加

S4

公司工资总和

AA0014K4K15K4K47K
AA0025K9K15K9K47K
AA0036K15K15K15K47K
CC1116.5K6.5K32K21.5K47K
CC1128K14.5K32K29.5K47K
CC1138.5K23K32K38K47K
CC1149K32K32K47K47K


二,聚合类开窗函数(全)

2.1,语法介绍

OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。

PRECEDING:往前

FOLLOWING:往后

CURRENT ROW:当前行

UNBOUNDED:起点

UNBOUNDED PRECEDING :表示从前面的起点

UNBOUNDED FOLLOWING:表示到后面的终点

FIRST_VALUE (col,true/ false):当前窗口下的第一个值,第二个参数 为 true ,跳过空值

LAST_VALUE (col,true/ false): 当前窗口下的最后一个值 ,第二个参数 为 true , 跳过空值

LAG(col,n,default_val):往前第n行数据

LEAD(col,n, default_val):往后第n行数据

2.2,代码示例

Select
id
,order_num
,sum(order_num) over (partition by id)  `分组内所有行`
,sum(order_num) over (partition by id order by dt) `从起点到当前行`
,sum(order_num) over (partition by id order by dt rows between unbounded preceding and current row) `默认为从起点到当前行`
,sum(order_num) over (partition by id order by dt rows between 3 preceding and current row) `当前行+往前3行`
,sum(order_num) over (partition by id order by dt rows between current row and 3 following) `当前行+往后3行`
,sum(order_num) over (partition by id order by dt rows between 3 preceding and 1 following) `当前行+往前3行+往后1行`
,sum(order_num) over (partition by id order by dt rows between current row and unbounded following) `当前行+往后所有行`
,max(order_num) over (partition by id order by dt rows between 3 preceding and 1 following) `当前行+往前3行+往后1行里面取最大`
,count(1) over (partition by id order by dt rows between 3 preceding and 1 following)    `当前行+往前3行+往后1行里面计数`
,avg(order_num) over (partition by id order by dt rows between 3 preceding and 1 following)    `当前行+往前3行+往后1行里面求平均数`
,first_value(order_num) over (partition by id order by dt rows between 3 preceding and 1 following) `当前行+往前3行+往后1行第1个值`
,last_value(order_num) over (partition by id order by dt rows between 3 preceding and 1 following ) `当前行+往前3行+往后1行第最后1个值` 
from tmp.table_test;

 2.3,结果展示

ok,如果你sql技能比较强,那么看完上面几张图,你大概就能懂得很多的技巧了。

三,滑动求和

关于滑动求和,涉及业务性强,很重要,上面2.2代码也展示到了,还是接着再分享些案例。

那么滑动求和,在实际的业务之中是什么样子的呢???

3.1,滑动求和代码如下

3.2,代码解析

很显然,上述代码先套个子查询,求出在最近一年的时间里,每天的公募私募产品的总保有量;

然后对其使用max()over() 开窗函数:

rows betwwen 29 perceding and current row ,是求出在前30天(包括当天),各保有量的最大值。

rows betwwen 354 perceding and current row ,是求出在前365天(包括当天),各保有量的最大值。

3.3,业务场景:

就是把公募私募产品,最近一个月,和最近一年的最大保有量,开窗展示出来。

=====================================================

欢迎一键三连!

  • 53
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
HiveSQL中,开窗函数是一种特殊的函数,用于在查询结果中添加一个新的窗口函数值列。开窗函数可以分为排序开窗函数聚合开窗函数。常用的排序开窗函数包括row_number()和rank()等。这些排序函数在over()子句中的order by语句只起到窗口内部排序的作用。开窗函数的基本用法包括设置窗口的方法,例如使用window_name、partition by和order by子句来指定窗口的大小和排序方式。另外,开窗函数还可以用于计算序号函数和分布函数。序号函数包括row_number()、rank()和dense_rank()等,用于计算每个行的序号。分布函数包括percent_rank()和cume_dist()等,用于计算某个值在整个结果集中的位置。此外,还有lag()和lead()函数用于获取前后指定行的值,以及first_value()和last_value()函数用于获取窗口内的第一个和最后一个值。在HiveSQL中,开窗函数可以与聚合函数结合使用,以便进行更复杂的计算和分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [hive sql常用开窗函数](https://blog.csdn.net/a822631129/article/details/124672228)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [hiveSQL开窗函数详解](https://blog.csdn.net/weixin_62759952/article/details/129269434)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不被定义喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值