大数据学习(112)-HIVE中的窗口函数

🍋🍋大数据学习🍋🍋

🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞


在 Apache Hive 中,窗口函数(Window Functions)是一类强大的 SQL 函数,用于对查询结果集的一个"窗口"或"分组"进行计算,而不减少结果集的行数。以下是 Hive 中常用的窗口函数分类及示例:

1. 排名函数

函数 描述
ROW_NUMBER() 为结果集中的每一行分配一个唯一的行号,行号从 1 开始。
RANK() 为结果集中的每一行分配一个排名,遇到相同值时跳过排名。
DENSE_RANK() 为结果集中的每一行分配一个排名,遇到相同值时不跳过排名。
NTILE(n) 将结果集划分为 n 个桶,并为每一行分配一个桶号。

示例

sql 复制代码
SELECT 
employee_id,
salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_in_department,
DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dense_rank_in_department,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_number_in_department
FROM employees;

2. 聚合函数(作为窗口函数)

函数 描述
SUM() 计算窗口内数值的总和。
AVG() 计算窗口内数值的平均值。
MIN() 返回窗口内的最小值。
MAX() 返回窗口内的最大值。
COUNT() 计算窗口内的行数。
sql 复制代码
SELECT 
employee_id,
department_id,
salary,
SUM(salary) OVER (PARTITION BY department_id) AS total_salary_in_department,
AVG(salary) OVER (PARTITION BY department_id) AS avg_salary_in_department
FROM employees;

3. 分析函数

函数 描述
LAG(column, n, default) 返回当前行之前第 n 行的值,如果超出范围则返回 default
LEAD(column, n, default) 返回当前行之后第 n 行的值,如果超出范围则返回 default
FIRST_VALUE(column) 返回窗口内第一行的值。
LAST_VALUE(column) 返回窗口内最后一行的值(需结合 ROWS BETWEEN 子句使用)。
NTH_VALUE(column, n) 返回窗口内第 n 行的值。
sql 复制代码
SELECT 
employee_id,
salary,
LAG(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY salary) AS prev_salary,
LEAD(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY salary) AS next_salary,
FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary) AS first_salary_in_department
FROM employees;

4. 累积函数

函数 描述
CUME_DIST() 计算当前行在窗口内的累积分布(小于等于当前值的比例)。
PERCENT_RANK() 计算当前行在窗口内的百分比排名。
sql 复制代码
SELECT 
employee_id,
salary,
CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary) AS cume_dist_in_department,
PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY salary) AS percent_rank_in_department
FROM employees;

5. 窗口定义

窗口函数通常与 OVER 子句一起使用,OVER 子句定义了窗口的范围和排序方式。

sql 复制代码
OVER (
[PARTITION BY column1, column2, ...]
[ORDER BY column3 [ASC|DESC], column4 [ASC|DESC], ...]
[ROWS|RANGE BETWEEN ... AND ...]
)
  • PARTITION BY:将结果集划分为多个分区,窗口函数在每个分区内独立计算。
  • ORDER BY:定义窗口内的排序顺序。
  • ROWS|RANGE BETWEEN:定义窗口的边界(可选)。
sql 复制代码
SELECT 
employee_id,
salary,
SUM(salary) OVER (
PARTITION BY department_id 
ORDER BY hire_date 
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS cumulative_salary_in_department
FROM employees;

6. 窗口边界

  • UNBOUNDED PRECEDING:窗口从分区的第一行开始。
  • UNBOUNDED FOLLOWING:窗口到分区的最后一行结束。
  • CURRENT ROW:窗口仅包含当前行。
  • n PRECEDING :窗口包含当前行之前的 n 行。
  • n FOLLOWING :窗口包含当前行之后的 n 行。
sql 复制代码
SELECT 
employee_id,
salary,
AVG(salary) OVER (
PARTITION BY department_id 
ORDER BY hire_date 
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moving_avg_salary_in_department
FROM employees;

总结

Hive 中的窗口函数为数据分析提供了强大的工具,可以用于排名、聚合、累积计算、前后值比较等操作。常见的窗口函数包括:

  • 排名函数ROW_NUMBER()RANK()DENSE_RANK()NTILE()
  • 聚合函数SUM()AVG()MIN()MAX()COUNT()
  • 分析函数LAG()LEAD()FIRST_VALUE()LAST_VALUE()NTH_VALUE()
  • 累积函数CUME_DIST()PERCENT_RANK()
相关推荐
NineData16 小时前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析
阿里云大数据AI技术2 天前
用 SQL 调大模型?Hologres + 百炼,让数据开发直接“对话”AI
sql·llm
西岸行者7 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
tryCbest7 天前
数据库SQL学习
数据库·sql
十月南城7 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
悠哉悠哉愿意7 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码7 天前
嵌入式学习路线
学习
王九思7 天前
Hive Thrift Server 介绍
数据仓库·hive·hadoop
cowboy2587 天前
mysql5.7及以下版本查询所有后代值(包括本身)
数据库·sql
毛小茛7 天前
计算机系统概论——校验码
学习