PostgreSQL 教程: avg 函数

九月 7, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的AVG()函数来计算一组值的平均值。

PostgreSQL AVG() 函数介绍

AVG()函数是 PostgreSQL 中最常用的聚合函数之一。AVG()函数允许您计算一组值的平均值。

AVG()函数的语法如下:

AVG(column)

您可以在SELECTHAVING子句中使用AVG()函数。

让我们看一下使用AVG函数的一些示例。

我们将使用 dvdrental 示例数据库中的payment表进行演示,如下:

payment table

PostgreSQL AVG() 函数示例

如果您想知道客户支付的平均金额,您可以在amount列上应用AVG函数,如下查询:

SELECT AVG(amount)
FROM payment;
        avg
--------------------
 4.2006056453822965
(1 row)

为了使输出更具可读性,您可以使用强制转换运算符,如下所示:

SELECT AVG(amount)::numeric(10,2) 
FROM payment;
 avg
------
 4.20
(1 row)

带 DISTINCT 运算符的 AVG() 函数

要计算集合中不同值的平均值,请使用 distinct 选项,如下所示:

AVG(DISTINCT column)

以下查询返回客户的平均付款额。因为我们使用了DISTINCT,PostgreSQL 仅采用唯一的金额计算平均值。

SELECT AVG(DISTINCT amount)::numeric(10,2)
FROM payment;
 avg
------
 6.14
(1 row)

请注意,结果与不使用DISTINCT选项的第一个示例不同。

将 AVG 函数与 SUM 函数一起使用

以下查询使用SUMAVG函数来计算客户支付的总金额以及所有交易的平均值。

SELECT
	AVG(amount)::numeric(10,2),
	SUM(amount)::numeric(10,2)
FROM
	payment;
 avg  |   sum
------+----------
 4.20 | 61312.04
(1 row)

将 AVG 函数与 GROUP BY 子句一起使用

要计算分组的平均值,请结合 GROUP BY 子句使用AVG函数。首先,GROUP BY子句将表的行分为组,然后将AVG函数应用于每个组。

以下示例使用AVG()函数结合GROUP BY子句计算每个客户支付的平均金额:

SELECT
	customer_id,
	first_name,
	last_name,
	AVG (amount)::NUMERIC(10,2)
FROM
	payment
INNER JOIN customer USING(customer_id)
GROUP BY
	customer_id
ORDER BY
	customer_id;

img

在查询中,我们使用内连接payment表与customer表连接起来。我们使用GROUP BY子句将客户分组,并应用AVG()函数计算每组的平均值。

将 AVG 函数与 HAVING 子句一起使用

您可以在HAVING子句中使用AVG函数根据特定条件过滤组。例如,对于所有客户,您可以获取平均付款大于 5 美元的客户。以下查询可帮助您执行此操作:

SELECT
	customer_id,
	first_name,
	last_name,
	AVG (amount)::NUMERIC(10,2)
FROM
	payment
INNER JOIN customer USING(customer_id)
GROUP BY
	customer_id
HAVING
	AVG (amount) > 5
ORDER BY
	customer_id;

img

此查询与上面的查询类似,但多了一个HAVING子句。我们在HAVING子句中使用AVG函数来过滤平均数量小等于 5 的组。

AVG 函数和 NULL

让我们看看当AVG()函数的输入为 NULL 时该函数的行为。

首先,创建一个表,名为t1

CREATE TABLE t1 (
	id serial PRIMARY KEY,
	amount INTEGER
);

其次,插入一些示例数据:

INSERT INTO t1 (amount)
VALUES
	(10),
	(NULL),
	(30);

t1表中的数据如下:

SELECT	* FROM 	t1;

img

第三步,使用AVG()函数计算金额列中的平均值。

SELECT AVG(amount)::numeric(10,2) 
FROM t1;
  avg
-------
 20.00
(1 row)

它返回 20,这意味着AVG()函数忽略了NULL值。

在本教程中,您学习了如何使用 PostgreSQL 的AVG()函数来计算集合的平均值。