八月 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
子句将行分为组并对每个组应用聚合函数。