hive开窗函数

1、什么是开窗函数?
开窗就是在查询的结果上多出一个列,特征就是带有over(),分为聚合开窗和排序开窗
2、常用的开窗函数
a、排序开窗

row_number() over(...) --从1开始生成序列
举例:select *,ROW_NUMBER() OVER (partition by id order by extract_time desc
同类型的有:rank() over(...)
dense_rank() over(..)

b、聚合开窗

sum(..) over(....)
举例:select v1,v2,sum(v2) over(partition by v1 order by v2) as sum
详情:https://blog.youkuaiyun.com/wawmg/article/details/40840093
--按照v1进行分组,同组内v2降序排序并累加
同类型的有:avg(...) over(....)
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、付费专栏及课程。

余额充值