在日常的数据统计与报表分析中,平均值是最常见的聚合指标之一。YashanDB 提供的 AVG(expr) 函数,用于计算给定表达式的平均值,支持多种数据类型与窗口分析能力。本文将带你全面了解它的用法与注意事项。
一、函数作用**
AVG(expr) 用于计算输入表达式在数据集中的平均值。既可以作为聚合函数处理整列数据,也可以作为窗口函数返回分组内的滑动平均。
二、参数与返回值类型
如果 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() 做空值替代处理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。