跳到主要内容

窗口函数

窗口函数(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;

输入:

namesalary
Alice5000
Bob6000
Charlie4500

输出:

namesalaryrow_num
Bob60001
Alice50002
Charlie45003

2. RANK()

RANK() 函数为每一行分配一个排名,排名相同的行将获得相同的序号,后续的序号会跳过。

sql
SELECT 
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;

输入:

namesalary
Alice5000
Bob6000
Charlie5000

输出:

namesalaryrank
Bob60001
Alice50002
Charlie50002

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;

输入:

monthrevenue
Jan1000
Feb1500
Mar2000

输出:

monthrevenuecumulative_sum
Jan10001000
Feb15002500
Mar20004500

实际应用场景

场景 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 中非常强大的工具,它们允许你在不改变原始数据的情况下,对数据进行复杂的计算和分析。通过使用窗口函数,你可以轻松地计算排名、累积总和、移动平均值等。

提示

在实际使用窗口函数时,建议先明确你的计算需求,然后选择合适的窗口函数和窗口范围。

附加资源

练习

  1. 使用 ROW_NUMBER() 函数为 employees 表中的员工编号。
  2. 使用 RANK() 函数计算 employees 表中员工的工资排名。
  3. 使用 SUM() 函数计算 sales 表中每个月的累积销售额。

通过完成这些练习,你将更好地理解窗口函数的用法和应用场景。