AVG 函数
概述
AVG
函数用于计算窗口内表达式的平均值。该函数可以应用于各种数值类型的数据,包括 TINYINT
、SMALLINT
、INT
、BIGINT
、FLOAT
、DOUBLE
和 DECIMAL
。返回结果的类型会根据输入类型进行相应的转换,DECIMAL
类型的结果会保留原有的精度和标度,其他类型则返回为 DOUBLE
类型。需要注意的是,NULL
值不会参与平均值的计算。
语法
AVG(expr) OVER ([PARTITION_clause] [ORDER_BY_clause] [FRAME_clause])
参数说明
expr
: 需要计算平均值的数值类型表达式。
PARTITION_clause
: 可选参数,用于将数据分区,以便在每个分区内分别计算平均值。
ORDER_BY_clause
: 可选参数,用于指定窗口内记录的排序方式。
FRAME_clause
: 可选参数,用于定义窗口的具体范围。
返回结果
AVG
函数返回一个数值,表示窗口内数据的平均值。对于 DECIMAL
类型,返回结果也是 DECIMAL
类型,其精度和标度可能会增加。其他类型的返回结果为 DOUBLE
类型。
示例
- 查询同一个部门(
dep_no
)的工资(salary
)的平均值,按照部门开窗,不排序:
SELECT dep_no, salary, AVG(salary) OVER (PARTITION BY dep_no)
FROM VALUES
('Eric', 1, 28000),
('Alex', 1, 32000),
('Felix', 2, 21000),
('Frank', 1, 30000),
('Tom', 2, 23000),
('Jane', 3, 29000),
('Jeff', 3, 35000),
('Paul', 2, 29000),
('Charles', 2, 23000)
AS tab(name, dep_no, salary);
+--------+--------+------------------------------------------+
| dep_no | salary | `AVG`(salary) OVER (PARTITION BY dep_no) |
+--------+--------+------------------------------------------+
| 3 | 29000 | 32000.0 |
| 3 | 35000 | 32000.0 |
| 1 | 28000 | 30000.0 |
| 1 | 32000 | 30000.0 |
| 1 | 30000 | 30000.0 |
| 2 | 21000 | 24000.0 |
| 2 | 23000 | 24000.0 |
| 2 | 29000 | 24000.0 |
| 2 | 23000 | 24000.0 |
+--------+--------+------------------------------------------+
- 查询同一个部门(
dep_no
)的工资(salary
)的累计平均值,按照部门开窗,按照工资排序。返回当前窗口中从开始行到与当前行工资相同所有行的平均值:
SELECT dep_no, salary, AVG(salary) OVER (PARTITION BY dep_no ORDER BY salary)
FROM VALUES
('Eric', 1, 28000),
('Alex', 1, 32000),
('Felix', 2, 21000),
('Frank', 1, 30000),
('Tom', 2, 23000),
('Jane', 3, 29000),
('Jeff', 3, 35000),
('Paul', 2, 29000),
('Charles', 2, 23000)
AS tab(name, dep_no, salary);
+--------+--------+--------------------------------------------------------------+
| dep_no | salary | `AVG`(salary) OVER (PARTITION BY dep_no ORDER BY salary ASC) |
+--------+--------+--------------------------------------------------------------+
| 3 | 29000 | 29000.0 |
| 3 | 35000 | 32000.0 |
| 1 | 28000 | 28000.0 |
| 1 | 30000 | 29000.0 |
| 1 | 32000 | 30000.0 |
| 2 | 21000 | 21000.0 |
| 2 | 23000 | 22333.333333333332 |
| 2 | 23000 | 22333.333333333332 |
| 2 | 29000 | 24000.0 |
+--------+--------+--------------------------------------------------------------+
注意事项
- 当窗口内没有非
NULL
值时,AVG
函数返回 NULL
。
- 使用
AVG
函数时,应确保分区、排序和窗口范围的定义符合预期