八月 31, 2023
摘要:在本教程中,您将学习如何使用 PostgreSQL 的GROUP BY子句将行分组。
目录
PostgreSQL GROUP BY 子句简介
GROUP BY子句将从SELECT语句返回的行分为几组。对于每个组,您可以应用聚合函数,例如,使用SUM()计算项目的总和,或使用COUNT()获取分组中的项目数。
以下语句说明了GROUP BY子句的基本语法:
SELECT
column_1,
column_2,
...,
aggregate_function(column_3)
FROM
table_name
GROUP BY
column_1,
column_2,
...;
在这个语法中:
- 首先,选择要分组的列,例如,
column1和column2,以及要应用聚合函数的列 (column3)。 - 其次,列出要在
GROUP BY子句中分组的列。
该语句子句按照GROUP BY子句中指定的列值对行进行分组,并计算每个组的值。
可以将SELECT语句的其他子句与GROUP BY子句一起使用。
PostgreSQL 计算GROUP BY子句的时间点,在FROM和WHERE子句之后, , 以及HAVING、SELECT、DISTINCT、ORDER BY 和LIMIT子句之前。

PostgreSQL GROUP BY 子句示例
让我们看一下示例数据库中的payment表。

1) 在没有聚合函数的情况下使用 GROUP BY 的示例
您可以使用GROUP BY子句而不应用聚合函数。以下查询从payment表中获取数据并按客户 ID 对结果进行分组。
SELECT
customer_id
FROM
payment
GROUP BY
customer_id;

在这种情况下,GROUP BY工作方式类似于从结果集中删除重复行的DISTINCT子句。
2) 配合SUM()函数使用 GROUP BY 的示例
GROUP BY子句与聚合函数结合使用时非常有用。
例如,要查询每个客户已支付的总金额,您可以使用GROUP BY子句将payment表中的行划分为按客户 ID 分组的组。对于每个分组,您可以使用SUM()函数计算总金额。
以下查询使用GROUP BY子句来获取每个客户已支付的总金额:
SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id;

GROUP BY子句按客户 ID 对结果集进行排序,并将属于同一客户的金额相加。每当customer_id发生变化时,它都会将该行添加到返回的结果集中。
以下语句使用带GROUP BY子句的ORDER BY子句对分组进行排序:
SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id
ORDER BY
SUM (amount) DESC;

3) 将 GROUP BY 子句与 JOIN 子句一起使用
以下语句使用GROUP BY子句和INNER JOIN子句获取每个客户支付的总金额。
与前面的示例不同,此查询将payment表与customer表连接起来,并按客户的姓名对客户进行分组。
SELECT
first_name || ' ' || last_name full_name,
SUM (amount) amount
FROM
payment
INNER JOIN customer USING (customer_id)
GROUP BY
full_name
ORDER BY amount DESC;

4) 配合COUNT()函数使用 GROUP BY 的示例
要查找每个员工已处理的付款交易数量,您可以按staff_id列中的值对payment表中的行进行分组,并使用COUNT()函数获取交易数量:
SELECT
staff_id,
COUNT (payment_id)
FROM
payment
GROUP BY
staff_id;

GROUP BY子句将付款中的行分为几组,并按staff_id列中的值对它们进行分组。对于每个组,它使用COUNT()函数返回行数。
5) 对多个列使用 GROUP BY
以下示例在GROUP BY子句中使用多个列:
SELECT
customer_id,
staff_id,
SUM(amount)
FROM
payment
GROUP BY
staff_id,
customer_id
ORDER BY
customer_id;
在此示例中,GROUP BY子句将payment表中的行按照customer_id和staff_id列中的值划分组。对于(customer_id, staff_id)的每组,使用SUM()计算总金额。

6) 将 GROUP BY 子句与日期列一起使用
payment_date是一个时间戳列。要按日期对付款进行分组,您可以使用DATE()函数首先将时间戳转换为日期,然后按结果日期对付款进行分组:
SELECT
DATE(payment_date) paid_date,
SUM(amount) sum
FROM
payment
GROUP BY
DATE(payment_date);

在本教程中,您学习了如何使用 PostgreSQL 的GROUP BY子句将行分为组并对每个组应用聚合函数。