简述Hive的开窗函数有哪些 ?
Hive的开窗函数(Window Functions)允许用户在数据的一个子集(称为窗口)上执行计算,而不改变查询的总体分组。这些函数特别适用于需要在数据集的不同部分之间进行比较或计算累计、移动平均等场景。以下是一些常用的Hive开窗函数:
- ROW_NUMBER():为窗口中的每一行分配一个唯一的整数编号,通常与
OVER()
子句结合使用来定义窗口。 -
RANK():为窗口中的每一行分配一个唯一的排名,相同的值会有相同的排名,并且会留下排名的间隙(例如,1, 2, 2, 4)。
-
DENSE_RANK():与
RANK()
类似,但是不会留下排名的间隙(例如,1, 2, 2, 3)。 -
NTILE(n):将窗口中的行分成指定数量的近似相等的组,并为每一行返回其所属的组的编号。
-
LAG(expr[, offset[, default]]):返回窗口中当前行之前指定偏移量的行的值。如果指定偏移量的行不存在,则返回默认值(如果提供了的话)。
-
LEAD(expr[, offset[, default]]):返回窗口中当前行之后指定偏移量的行的值。如果指定偏移量的行不存在,则返回默认值(如果提供了的话)。
-
FIRST_VALUE(expr):返回窗口中第一行的值。
-
LAST_VALUE(expr):返回窗口中最后一行的值。
-
SUM(expr) OVER (window_spec):计算窗口中表达式的累计和。
-
AVG(expr) OVER (window_spec):计算窗口中表达式的平均值。
-
MIN(expr) OVER (window_spec):返回窗口中表达式的最小值。
-
MAX(expr) OVER (window_spec):返回窗口中表达式的最大值。
在使用这些开窗函数时,通常需要与OVER()
子句一起使用来定义窗口的范围和排序方式。OVER()
子句可以接受PARTITION BY
(用于定义窗口内的分区)和ORDER BY
(用于定义窗口内的排序顺序)子句。
例如,以下查询使用ROW_NUMBER()
函数为每个部门的员工按薪水排名:
SELECT dept, name, salary,
ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) as rank
FROM employees;
这个查询将员工数据按部门分区,并在每个部门内按薪水降序排序,然后为每个员工分配一个行号。