PostgreSQL 8.2.3 中文文档
后退快退章9. 函数和操作符快进前进

9.15. 聚集函数

聚集函数从一组输入值里计算一个结果。表9-37和表9-38显示了内建的聚集函数。聚集函数的特殊语法在节4.2.7里解释。请参考节2.7获取额外的介绍性信息。

表9-37. 通用聚集函数

函数参数类型返回类型描述
avg(expression)smallint, int, bigint, real, double precision, numeric, interval对于任何整数类型输入,结果都是 numeric 类型。对于任何浮点输入,结果都是 double precision 类型。否则和输入数据类型相同。所有输入值的均值(算术平均)
bit_and(expression)smallint, int, bigint, bit和参数数据类型相同所有非 NULL 输入值的按位与(AND),如果全部输入值皆为 NULL ,那么结果也为 NULL 。
bit_or(expression)smallint, int, bigint, bit和参数数据类型相同所有非 NULL 输入值的按位或(OR),如果全部输入值皆为 NULL ,那么结果也为 NULL 。
bool_and(expression)boolbool如果所有输入值都是真,则为真,否则为假。
bool_or(expression)boolbool如果至少有一个输入值为真,则为真,否则为假。
count(*) bigint输入行数
count(expression)任意bigint计算所有输入行中满足 expression 不为 NULL 的行数。
every(expression)boolbool等效于 bool_and
max(expression)任意数组、数值、字符串、日期/时间类型和参数数据类型相同所有输入行中 expression 的最大值
min(expression)任意数组、数值、字符串、日期/时间类型和参数数据类型相同所有输入行中 expression 的最小值
sum(expression)smallint, int, bigint, real, double precision, numeric, interval对于 smallint 或 int 输入,输出类型为 bigint 。对于 bigint 输入,输出类型为 numeric ,对于浮点数输入,输出类型为 double precision 。否则和输入数据类型相同。所有输入行的 expression 总和。

请注意,除了 count 以外,这些函数在没有输入行时返回 NULL 。尤其要指出的是 sum 函数在没有输入行时返回 NULL ,而不是零。必要时可以用 coalesce 把 NULL 替换成零。

【注意】bool_and 和 bool_or 布尔聚集对应标准的 SQL 聚集 every 和 any 或 some 。对于 any 和 some ,标准语法里面似乎有些内置的歧义:

SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;

这里的 ANY 既可以被认为是引出一个子查询,也可以被认为是一个聚集(如果查询表达式返回1行的话)。因此标准的名字无法用于这些聚集。

【注意】习惯了其它 SQL 数据库管理系统的用户可能被用于全表计算的 count 的性能(之慢)惊住了。一个类似下面这样的查询:

SELECT count(*) FROM sometable;

将会被 PostgreSQL 用全表扫描执行。

表9-38展示了用于统计分析的聚集函数。单独列出这些函数仅仅是为了避免和那些经常使用的聚集函数混在一起而已。"描述"列中的 N 表示所有输入行中使得输入表达式不为 NULL 的行数。总的来说,如果计算本身变得没有意义,那么返回值将是 NULL 。例如当 N 为零的时候。

表9-38. 统计聚集函数

函数参数类型返回类型描述
corr(Y, X)double precisiondouble precision相关系数
covar_pop(Y, X)double precisiondouble precision总体协方差
covar_samp(Y, X)double precisiondouble precision样本协方差
regr_avgx(Y, X)double precisiondouble precision自变量的平均值(sum(X)/N)
regr_avgy(Y, X)double precisiondouble precision因变量的平均值(sum(Y)/N)
regr_count(Y, X)double precisionbigint 两个表达式都不为 NULL 的输入行数
regr_intercept(Y, X)double precisiondouble precision根据所有输入的点(X, Y)按照最小二乘法拟合成一个线性方程,然后返回该直线的 Y 轴截距
regr_r2(Y, X)double precisiondouble precision相关系数的平方
regr_slope(Y, X)double precisiondouble precision根据所有输入的点(X, Y)按照最小二乘法拟合成一个线性方程,然后返回该直线的斜率。
regr_sxx(Y, X)double precisiondouble precisionsum(X^2) - sum(X)^2/N ("sum of squares" of the independent variable)
regr_sxy(Y, X)double precisiondouble precisionsum(X*Y) - sum(X) * sum(Y)/N ("sum of products" of independent times dependent variable)
regr_syy(Y, X)double precisiondouble precisionsum(Y^2) - sum(Y)^2/N ("sum of squares" of the dependent variable)
stddev(expression)smallint, int, bigint, real, double precision, numeric对于浮点类型的输入返回 double precision ,其它输入返回 numericstddev_samp 的别名(历史原因)
stddev_pop(expression)smallint, int, bigint, real, double precision, numeric对于浮点类型的输入返回 double precision ,其它输入返回 numeric总体标准差
stddev_samp(expression)smallint, int, bigint, real, double precision, numeric对于浮点类型的输入返回 double precision ,其它输入返回 numeric样本标准差
variance(expression)smallint, int, bigint, real, double precision, numeric对于浮点类型的输入返回 double precision ,其它输入返回 numericvar_samp 的别名(历史原因)
var_pop(expression)smallint, int, bigint, real, double precision, numeric对于浮点类型的输入返回 double precision ,其它输入返回 numeric总体方差(总体标准差的平方)
var_samp(expression)smallint, int, bigint, real, double precision, numeric对于浮点类型的输入返回 double precision ,其它输入返回 numeric样本方差(样本标准差的平方)

后退首页前进
数组函数和操作符上一级子查询表达式