hive开窗函数大全

本文详细介绍了Hive中的窗口函数,包括sum、max、min、avg等聚合函数,以及row_number、ntile、rank、dense_rank等排名函数。还讲解了LAG、LEAD、FIRST_VALUE、LAST_VALUE等函数的使用,以及CUME_DIST和PERCENT_RANK在统计中的作用。此外,还探讨了GROUPING SETS、GROUPING__ID、CUBE和ROLLUP在分组聚合中的功能和差异。

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

-- 窗口函数sum,max,min,avg

SELECT 
cookieid,
createtime,
pv,
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime) AS pv1,
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS pv2,
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 1 PRECEDING AND 3 FOLLOWING) AS pv3,
SUM(pv) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) AS pv4
FROM lxw1234;

-- 窗口函数row_number,ntile,rank,dense_rank(不支持rows between)
-- row_number分组排名,ntile切片,rank分组排名留空,dense_rank分组排名不留空

SELECT
cookieid,
createtime,
pv,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,--排名,分组内每条记录一个行号,无关心createtime是否相同
NTILE(3) OVER(PARTITION BY cookieid ORDER BY createtime) AS rn1,--表示对分组内的数据排序后切3片,多余的会加到第一片中
RANK() OVER(PARTITION BY cookieid ORDER BY
Hive中的开窗函数(Window Function)是一种强大的分析工具,它允许在数据集中执行聚合、排序、排名等操作,同时保留原始数据行。开窗函数的核心在于定义一个“窗口”或“数据集范围”,在这个范围内执行计算。 ### 基本语法 Hive开窗函数的基本语法如下: ```sql function_name (expression) OVER ( [PARTITION BY partition_expression] [ORDER BY order_expression] [window_frame_clause] ) ``` - `function_name`:可以是聚合函数(如`SUM`, `AVG`, `COUNT`)或排名函数(如`ROW_NUMBER`, `RANK`, `DENSE_RANK`)。 - `PARTITION BY`:将数据划分为多个分区,每个分区独立进行计算。 - `ORDER BY`:在窗口内对数据进行排序。 - `window_frame_clause`:定义窗口的范围,例如`ROWS BETWEEN ... AND ...`。 ### 示例 #### 1. 聚合开窗函数 假设有一个名为`stu_scores`的表,包含学生的成绩信息,包括学生ID (`stu_id`)、数学成绩 (`math`) 和班级ID (`class_id`)。可以使用开窗函数计算每个班级的学生人数: ```sql select stu_id, math, class_id, count(math) over(partition by class_id) as ct1 from stu_scores; ``` 此查询将按`class_id`分组,并计算每个班级的学生人数[^2]。 #### 2. 排名开窗函数 Hive提供了几种排名函数,如`ROW_NUMBER`, `RANK`, 和 `DENSE_RANK`。这些函数可以用于对数据进行排名。例如,假设有一个名为`student_scores`的表,包含学生ID (`studentId`)、数学成绩 (`math`) 和班级ID (`classId`),可以使用`ROW_NUMBER`为每个班级的学生按数学成绩排序: ```sql select studentId, math, classId, row_number() over(partition by classId order by math desc) as rank from student_scores; ``` 此查询将按`classId`分组,并在每个班级内按数学成绩降序排列学生[^2]。 #### 3. 聚合与窗口范围 可以结合窗口范围定义更复杂的计算。例如,计算每个班级中当前行及其前后几行的数学成绩总和: ```sql select studentId, math, classId, sum(math) over(partition by classId order by studentId rows between 1 preceding and 2 following) as sum_math from student_scores; ``` 此查询将按`classId`分组,并在每个班级内按学生ID排序后,计算当前行及其前一行和后两行的数学成绩总和[^3]。 ### 应用场景 Hive开窗函数适用于多种数据分析场景,包括但不限于: - **时间序列分析**:计算移动平均值、累计和等。 - **排名分析**:为数据集中的记录分配排名。 - **分组统计**:在不减少数据行的情况下进行分组统计。 通过这些功能,Hive开窗函数能够提供更灵活和强大的数据分析能力,使得用户能够在大数据环境中进行复杂的分析任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值