SQL聚合函数 AVG

2022-03-27 12:03:52 浏览数 (2)

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返回NUMERICDOUBLE数据类型。 如果expressionDOUBLE类型,AVG返回DOUBLE; 否则,它返回NUMERIC

描述

AVG聚合函数返回表达式值的平均值。 通常,表达式是查询返回的多行中字段的名称(或包含一个或多个字段名称的表达式)。

AVG可以用于引用表或视图的SELECT查询或子查询。 AVG可以出现在SELECT列表或HAVING子句中,与普通字段值一起出现。

AVG不能在WHERE子句中使用。 AVG不能在JOINON子句中使用,除非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

代码语言:javascript复制
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总是返回数据的当前状态,包括未提交的更改。

0 人点赞