PostgreSQL 教程: GROUP BY 分组

八月 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,
   ...;

在这个语法中:

  • 首先,选择要分组的列,例如,column1column2,以及要应用聚合函数的列 (column3)。
  • 其次,列出要在GROUP BY子句中分组的列。

该语句子句按照GROUP BY子句中指定的列值对行进行分组,并计算每个组的值。

可以将SELECT语句的其他子句与GROUP BY子句一起使用。

PostgreSQL 计算GROUP BY子句的时间点,在FROMWHERE子句之后, , 以及HAVINGSELECTDISTINCTORDER BYLIMIT子句之前。

PostgreSQL GROUP BY

PostgreSQL GROUP BY 子句示例

让我们看一下示例数据库中的payment表。

payment

1) 在没有聚合函数的情况下使用 GROUP BY 的示例

您可以使用GROUP BY子句而不应用聚合函数。以下查询从payment表中获取数据并按客户 ID 对结果进行分组。

SELECT
   customer_id
FROM
   payment
GROUP BY
   customer_id;

PostgreSQL Group By example

在这种情况下,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;

PostgreSQL Group By with SUM

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;

PostgreSQL Group By and Order By

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;

img

4) 配合COUNT()函数使用 GROUP BY 的示例

要查找每个员工已处理的付款交易数量,您可以按staff_id列中的值对payment表中的行进行分组,并使用COUNT()函数获取交易数量:

SELECT
	staff_id,
	COUNT (payment_id)
FROM
	payment
GROUP BY
	staff_id;

PostgreSQL Group By and Count

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_idstaff_id列中的值划分组。对于(customer_id, staff_id)的每组,使用SUM()计算总金额。

PostgreSQL Group By multiple columns

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 dates

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