在日常的数据统计与报表分析中,平均值是最常见的聚合指标之一。YashanDB 提供的 AVG(expr) 函数,用于计算给定表达式的平均值,支持多种数据类型与窗口分析能力。本文将带你全面了解它的用法与注意事项。

image.png
一、函数作用**

AVG(expr) 用于计算输入表达式在数据集中的平均值。既可以作为聚合函数处理整列数据,也可以作为窗口函数返回分组内的滑动平均。

二、参数与返回值类型

image.png

如果 expr 为不能转换为数值的字符串,则会返回 Invalid number 错误;

对不支持的类型(如日期、布尔、JSON 等),该函数不可用。

三、NULL 值处理规则

单行表达式:如果 expr 为 NULL,结果为 NULL;

多行聚合:自动忽略 NULL 值,若所有值均为 NULL,则结果为 NULL。

四、使用 DISTINCT 与 ALL

AVG(DISTINCT expr):排除重复值后再求平均;

AVG(ALL expr):默认行为,包含所有非空行。

示例:

SELECT AVG(employee_count) AS res FROM area1;
-- 输出:333.333...
SELECT AVG(DISTINCT employee_count) AS res FROM area1;
-- 输出:350

五、作为窗口函数使用(AVG + OVER)

使用 OVER 子句时,AVG() 可以作为窗口函数,用于按组进行滑动平均计算。

示例数据:

SELECT year, month, branch, revenue_total FROM finance_info;

示例用法:

SELECT year, month,
       revenue_total AS curr,
       AVG(revenue_total) OVER (
           PARTITION BY year
           ORDER BY month
           ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
       ) AS tonow
FROM finance_info;

该语句会按年份分组,并基于月份按顺序累计计算平均收入。

六、AVG 嵌套使用说明

注意事项:

AVG() 函数不支持嵌套写法,如 AVG(AVG(...));

如果需要类似效果,请使用外层 GROUP BY + 内层窗口函数组合实现。

示例:

SELECT year, month,
       AVG(revenue_total) AS curr,
       AVG(AVG(revenue_total)) OVER (
           PARTITION BY year
           ORDER BY month
           ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
       ) AS tonow
FROM finance_info
GROUP BY year, month;

七、实用建议

建议在数值类型字段上使用 AVG,避免字符转换错误;

使用窗口函数时,结合 PARTITION BY + ORDER BY 更能体现 AVG 的统计价值;

注意 NULL 的默认过滤行为,必要时可通过 NVL() 做空值替代处理。


数据库砖家
1 声望0 粉丝