hive的开窗函数篇

本文详细介绍了SQL中的窗口函数over()的使用,包括其语法结构、常见操作如分组、排序和窗口范围设置。讲解了如何利用over()进行逐行累计求和、分组求和以及与其他分析函数如avg()、sum()、rank()等配合使用的方法,并通过实例进行了演示。同时,解释了window函数与groupby的区别和共同使用时的数据生成流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开窗函数over(),over()里面一般可以配合分组,排序,窗口范围三个条件使用,也可以单独用一个条件,格式如over(partition by order by between ... and)

通过partition by 关键字来对窗口分组,特殊注意:通过order by 来对order by字段排序后的行进行开窗,窗口范围如果没有设置,则每一行对应整张表。窗口函数一般和分析函数连用。

1、over()窗口函数的语法结构

分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置)

over()函数中包括三个函数: 

order by是排序的意思

partition bypartition by可理解为group by 分组。over(partition by 列名)搭配分析函数时,分析函数按照每一组每一组的数据进行计算的。rows between 开始位置 and 结束位置是指定窗口范围,比如第一行到当前行。而这个范围是随着数据变化的。over(rows between 开始位置 and 结束位置)搭配分析函数时,分析函数按照这个范围进行计算的。

窗口范围说明:我们常使用的窗口范围是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行),常用该窗口来计算累加。

窗口范围说明:我们常使用的窗口范围是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行),常用该窗口来计算累加。

PRECEDING:往前

FOLLOWING:往后 CURRENT ROW:当前行 UNBOUNDED:起点(一般结合PRECEDING,FOLLOWING使用) UNBOUNDED PRECEDING 表示该窗口最前面的行(起点) UNBOUNDED FOLLOWING:表示该窗口最后面的行(终点)

比如说: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行) ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING(表示往前2行到往后1行) ROWS BETWEEN 2 PRECEDING AND 1 CURRENT ROW(表示往前2行到当前行) ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING(表示当前行到终点)

2、示例

示例:现有一张表数据,三列,name,month,num

 

(1)使用开窗逐行累计求和(加不加排序不影响)

     select * ,sum(num) over(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) from fangwen;

    select * ,sum(num) over( order by month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) from fangwen;

    (2)分不同的name分组,逐行累计求和

select * ,sum(num) over(partition by name ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) total from fangwen;

 不同的组之间互不影响。

(3)分组排序逐行求和

select * ,sum(num) over(partition by name order by month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) total from fangwen;

(4)只排序,不分组,不指定窗口范围,结果会把排序列同样的作为一个窗口,后续的排序列会把前面的排序列当成窗口行。

select *,sum(num) over (order by month) from fangwen;

注意:select *,sum(num) over ( partition by name order by month) from fangwen 和上面又不一样了,例如:

先分组,然后在分组内部吧排序相同的列作为一个窗口,比如,在name为B的时候,按照月份分1和2,月份2有俩行排序是一样的,所以他们的累计和事一样的。

3、常与over()一起使用的分析函数:

(1)聚合类

avg()、sum()、max()、min()

(2)排名类

row_number()按照值排序时产生一个自增编号,不会重复(如:1、2、3、4、5、6)

rank() 按照值排序时产生一个自增编号,值相等时会重复,会产生空位(如:1、2、3、3、3、6)

dense_rank() 按照值排序时产生一个自增编号,值相等时会重复,不会产生空位(如:1、2、3、3、3、4)

(3)其他类

lag(列名,往前的行数,[行数为null时的默认值,不指定为null]),可以计算用户上次购买时间,或者用户下次购买时间。或者上次登录时间和下次登录时间

lead(列名,往后的行数,[行数为null时的默认值,不指定为null])

ntile(n) 把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,ntile返回此行所属的组的编号

lag示例:

select * ,lag(time,1) over(partition by name order by time asc ) from leg_lead;

lead示例:

 select * ,lead(time,1) over(partition by name order by time asc ) from leg_lead;

ntile(n)一般用法按照排序之后把数据分成n组,好让你得到你要的组。

如下:

FIRST_VALUE 取分组内排序后,截止到当前行,第一个值

LAST_VALUE 取分组内排序后,截止到当前行,最后一个值(其实就是当前行,作用不大,所以不常用)

 (4)开窗聚合函数和group by的共用

原始数据。

不带group by的开窗数据

select shop_id,user_id,count(1) over(partition by user_id) from tmp.practice;

带了group by的开窗数据

select shop_id,user_id,count(1) over(partition by user_id) from tmp.practice group by shop_id,user_id;

所以,看出带了group by之后,开窗函数的作用范围是,group by之后的数据了,不再是原始数据。

结论:group by和over()配合起来使用的数据生成的流程是,先通过group by进行分组聚合,over函数是作用在group by所生成的数据之上的。

Hive开窗函数是一种用于在查询结果中执行聚合计算的函数。它们可以在分组的数据上执行计算,并返回结果集中的每一行的聚合值。开窗函数可以使用PARTITION BY子句对数据进行分组,并使用ORDER BY子句对数据进行排序。然后,可以在开窗函数内部使用聚合函数(如SUM、AVG、MAX、MIN、COUNT)对每个分组的数据进行计算。\[2\] 下面是一个使用Hive开窗函数的示例: ``` SELECT user_id, create_date, LAG(create_date, 1, '0000-00-00') OVER (PARTITION BY user_id) AS lag_date, LEAD(create_date, 1, '9999-99-99') OVER (PARTITION BY user_id) AS lead_date, FIRST_VALUE(create_date) OVER (PARTITION BY user_id) AS first_date, LAST_VALUE(create_date) OVER (PARTITION BY user_id) AS last_date FROM order_info; ``` 在这个示例中,我们使用了LAG、LEAD、FIRST_VALUE和LAST_VALUE函数来计算每个用户的前一天日期、后一天日期、第一个日期和最后一个日期。这些函数在每个用户分组内进行计算,并返回结果集中的每一行的相应值。\[2\] 除了开窗函数Hive还提供了其他函数,如NVL函数和CASE WHEN THEN ELSE END函数。NVL函数用于处理空值,可以将空值替换为指定的默认值。CASE WHEN THEN ELSE END函数类似于C语言中的case语句,用于根据条件对字段值进行判断和处理。\[1\]\[3\] #### 引用[.reference_title] - *1* *3* [Hive——Hive常用内置函数总结](https://blog.csdn.net/weixin_44606952/article/details/127929532)[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^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [HIVE函数汇总--开窗函数](https://blog.csdn.net/weixin_43935266/article/details/122307605)[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^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值