提要:在本教程中,您将学习如何使用 PostgreSQL 的 GROUP BY 对数据进行分组。

介绍 PostgreSQL 的 GROUP BY

GROUP BY 子句用来将 SELECT 语句返回的行进行分组。每个组里都可以使用聚合函数(aggregate function),比如:SUM 函数、COUNT 函数等。

它的语法如下:

SELECT column_1, aggregate_function(column_2)
FROM tbl_name
GROUP BY column_1;

GROUP BY 必须出现在 FROMWHERE 子句的后边。GROUP BY 后面可以可以接一到多个字段,字段之间使用英文逗号(,)分隔。当然,也可以在 GROUP BY 后面跟表达式。

PostgreSQL GROUP BY 示例

来看一下示例数据库中的 payment 表。

payment表结构

未使用聚合函数的 PostgreSQL GROUP BY

可以不在 GROUP BY 里使用聚合函数,下面的例子将从 payment 表中获取数据,并依据 customer_id 字段进行分组。

SELECT
 customer_id
FROM
 payment
GROUP BY
 customer_id;

GROUP-BY-without-aggregate-function

这个例子中,GROUP BY 的作用和 DISTINCT 类似,都是从结果集中去除重复的数据。

PostgreSQL GROUP BY 和 SUM 函数

GROUP BY 子句与聚合函数结合使用时非常有用。比如,通过在 payment 进行分组可以计算出有多少客户付了款。每个分组后的行,可以使用 SUM 函数对支付的金额进行求和。

SELECT
 customer_id,
 SUM (amount)
FROM
 payment
GROUP BY
 customer_id;

GROUP-BY-customer

GROUP BY 子句还可以和 ORDER BY 结合使用:

SELECT
 customer_id,
 SUM (amount)
FROM
 payment
GROUP BY
 customer_id
ORDER BY
 SUM (amount) DESC;

GROUP-BY-with-ORDER-BY

PostgreSQL GROUP BY 和 COUNT 函数

要计算每个员工处理的交易数量,请根据员工编号对支付表进行分组,然后使用COUNT函数获取交易数量,如下所示:

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

GROUP-BY-staff

要对已分组的数据进行筛选,需要使用 HAVING 来代替 WHERE

下一篇:PostgreSQL的HAVING