SQL聚合函数 AVG
返回指定列值的平均值的聚合函数。
大纲
代码语言:javascript复制AVG([ALL | DISTINCT [BY(col-list)]] expression [%FOREACH(col-list)] [�TERHAVING])
参数
-
ALL
- 可选-指定AVG
返回表达式所有值的平均值。 如果没有指定关键字,则为默认值。 -
DISTINCT
- 可选 -DISTINCT
子句,指定AVG
只计算一个值的唯一实例的平均值。DISTINCT
可以指定BY(col-list)
子句,其中col-list
可以是单个字段,也可以是逗号分隔的字段列表。 -
expression
- 任何有效的表达式。 通常是包含要取平均值的数据值的列的名称。 -
%FOREACH(col-list)
- 可选—列名或以逗号分隔的列名列表。 -
�TERHAVING
- 可选 - 应用在HAVING
子句中找到的条件。
AVG
返回NUMERIC
或DOUBLE
数据类型。
如果expression
是DOUBLE
类型,AVG
返回DOUBLE
;
否则,它返回NUMERIC
。
描述
AVG
聚合函数返回表达式值的平均值。
通常,表达式是查询返回的多行中字段的名称(或包含一个或多个字段名称的表达式)。
AVG
可以用于引用表或视图的SELECT
查询或子查询。
AVG
可以出现在SELECT
列表或HAVING
子句中,与普通字段值一起出现。
AVG
不能在WHERE
子句中使用。
AVG
不能在JOIN
的ON
子句中使用,除非SELECT
是子查询。
像所有聚合函数一样,AVG
可以带有一个可选的DISTINCT
子句。
AVG(DISTINCT col1)
仅对不同(唯一)的col1
字段值进行平均。
AVG(DISTINCT BY(col2) col1)
仅对col2
值不同(唯一)的记录中的col1
字段值进行平均值。
但是请注意,不同的col2
值可能包含一个单独的NULL值。
数据值
对于非double
表达式值,AVG
返回双精度浮点数。
AVG
返回的值的精度是18
。
返回值的比例取决于表达式的精度和比例:AVG
返回值的比例等于18
减去表达式的精度,加上表达式的比例(as=ap-ep es)
。
对于DOUBLE
表达式值,精度为0。
AVG
通常应用于具有数值值的字段或表达式,例如数字字段或日期字段。
默认情况下,聚合函数使用逻辑(内部)数据值,而不是Display
值。
因为没有执行类型检查,所以可以(尽管很少有意义)对非数字字段调用类型检查;
AVG
计算非数值,包括空字符串("
)为零(0
)。如果expression
是数据类型VARCHAR
,则返回值为数据类型DOUBLE
。
在导出AVG
聚合函数值时,数据字段中的NULL
值将被忽略。
如果查询没有返回行,或者返回的所有行的数据字段值为NULL
, AVG
返回NULL
。
对单个值求平均值
如果提供给AVG
的所有表达式值都是相同的,那么结果的平均值取决于访问表中的行数(除数)。
例如,如果表中的所有行对某个特定列具有相同的值,那么该列的平均值就是一个计算值,它可能与个别列中的值略有不同。
为了避免这种差异,可以使用DISTINCT
关键字。
下面的例子展示了计算平均值如何产生轻微的不平等。
第一个查询不引用表行,所以AVG
通过除以1
进行计算。
第二个查询引用表的行,因此AVG
通过除以表中的行数进行计算。
第三个查询引用了表行,但是平均了单个值的DISTINCT
值;
在这种情况下,AVG
计算除以1
。
ClassMethod Avg()
{
s pi = $ZPI
&sql(SELECT :pi,AVG(:pi) INTO :p,:av FROM Sample.Person)
w p," pi的值",!
w av," avg of pi/1",!
&sql(SELECT Name,:pi,AVG(:pi) INTO :n,:p,:av FROM Sample.Person)
w av," avg calculated using numrows",!
&sql(SELECT Name,:pi,AVG(DISTINCT :pi) INTO :n,:p,:av FROM Sample.Person)
w av," avg of pi/1"
}
代码语言:javascript复制3.141592653589793238 pi的值
3.141592653589793238 avg of pi/1
3.141592653589793206 avg calculated using numrows
3.141592653589793206 avg of pi/1
优化
SQL
优化AVG
计算可以使用位片索引,如果这个索引是为字段定义的。
当前事务期间所做的更改
与所有聚合函数一样,无论当前事务的隔离级别如何,AVG
总是返回数据的当前状态,包括未提交的更改。