窗口函数
窗口函数(Window Functions)是 Hive 中用于在数据集的特定“窗口”上执行计算的功能强大的工具。它们允许你在不改变原始数据的情况下,对数据进行分组、排序和聚合操作。窗口函数特别适用于需要在数据集的子集上执行计算的场景,例如计算累积总和、移动平均值或排名。
什么是窗口函数?
窗口函数是一种特殊的函数,它可以在数据集的特定“窗口”上执行计算。这个“窗口”是由 OVER
子句定义的,它指定了数据的排序方式和分组的范围。窗口函数不会改变原始数据的行数,而是为每一行返回一个计算结果。
窗口函数通常用于以下场景:
- 计算累积总和或平均值
- 计算排名或百分比
- 计算移动平均值或总和
- 比较当前行与前后行的值
窗口函数的基本语法
窗口函数的基本语法如下:
sql
function_name (expression) OVER (
[PARTITION BY partition_expression]
[ORDER BY sort_expression]
[ROWS BETWEEN frame_start AND frame_end]
)
function_name
: 窗口函数的名称,例如ROW_NUMBER()
、RANK()
、SUM()
等。expression
: 要计算的表达式。PARTITION BY
: 将数据分组,窗口函数将在每个分组内独立计算。ORDER BY
: 指定数据的排序方式。ROWS BETWEEN
: 定义窗口的起始和结束位置。
常用的窗口函数
1. ROW_NUMBER()
ROW_NUMBER()
函数为每一行分配一个唯一的序号,序号从 1 开始。通常用于为数据行编号。
sql
SELECT
name,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;
输入:
name | salary |
---|---|
Alice | 5000 |
Bob | 6000 |
Charlie | 4500 |
输出:
name | salary | row_num |
---|---|---|
Bob | 6000 | 1 |
Alice | 5000 | 2 |
Charlie | 4500 | 3 |
2. RANK()
RANK()
函数为每一行分配一个排名,排名相同的行将获得相同的序号,后续的序号会跳过。
sql
SELECT
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;
输入:
name | salary |
---|---|
Alice | 5000 |
Bob | 6000 |
Charlie | 5000 |
输出:
name | salary | rank |
---|---|---|
Bob | 6000 | 1 |
Alice | 5000 | 2 |
Charlie | 5000 | 2 |
3. SUM()
SUM()
函数可以用于计算累积总和或移动总和。
sql
SELECT
month,
revenue,
SUM(revenue) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sum
FROM sales;
输入:
month | revenue |
---|---|
Jan | 1000 |
Feb | 1500 |
Mar | 2000 |
输出:
month | revenue | cumulative_sum |
---|---|---|
Jan | 1000 | 1000 |
Feb | 1500 | 2500 |
Mar | 2000 | 4500 |
实际应用场景
场景 1:计算员工的工资排名
假设你有一个员工表 employees
,你想要计算每个员工的工资排名。
sql
SELECT
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
场景 2:计算每个月的累积销售额
假设你有一个销售表 sales
,你想要计算每个月的累积销售额。
sql
SELECT
month,
revenue,
SUM(revenue) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_revenue
FROM sales;
总结
窗口函数是 Hive 中非常强大的工具,它们允许你在不改变原始数据的情况下,对数据进行复杂的计算和分析。通过使用窗口函数,你可以轻松地计算排名、累积总和、移动平均值等。
提示
在实际使用窗口函数时,建议先明确你的计算需求,然后选择合适的窗口函数和窗口范围。
附加资源
练习
- 使用
ROW_NUMBER()
函数为employees
表中的员工编号。 - 使用
RANK()
函数计算employees
表中员工的工资排名。 - 使用
SUM()
函数计算sales
表中每个月的累积销售额。
通过完成这些练习,你将更好地理解窗口函数的用法和应用场景。