GROUP BY 子句
GROUP BY 子句标识查询的分组列。它用于将表中在所有列出的列中具有相同值的行组合在一起。列的列出顺序并不重要。结果是将每组具有共同值的行组合到一个组行中,而该组行表示组中的所有行。使用 GROUP BY 可消除输出中的冗余,并计算适用于这些组的聚合。必须在查询使用标准函数(例如,SUM、AVG 和 COUNT)计算聚合时声明分组列。有关更多信息,请参阅 聚合函数。
语法
[ GROUP BY expression [, ...] | ALL | aggregation_extension ]
其中,aggregation_extension 为以下之一:
GROUPING SETS ( () | aggregation_extension [, ...] ) | ROLLUP ( expr [, ...] ) | CUBE ( expr [, ...] )
参数
- expression
-
列或表达式的列表必须匹配查询的选择列表中的非聚合表达式的列表。例如,考虑以下简单查询。
select listid, eventid, sum(pricepaid) as revenue, count(qtysold) as numtix from sales group by listid, eventid order by 3, 4, 2, 1 limit 5; listid | eventid | revenue | numtix -------+---------+---------+-------- 89397 | 47 | 20.00 | 1 106590 | 76 | 20.00 | 1 124683 | 393 | 20.00 | 1 103037 | 403 | 20.00 | 1 147685 | 429 | 20.00 | 1 (5 rows)
在此查询中,选择列表包含两个聚合表达式。第一个聚合表达式使用 SUM 函数,第二个聚合表达式使用 COUNT 函数。必须将其余两个列(LISTID 和 EVENTID)声明为分组列。
GROUP BY 子句中的表达式也可以使用序号来引用选择列表。例如,上一个示例的缩略形式如下。
select listid, eventid, sum(pricepaid) as revenue, count(qtysold) as numtix from sales group by 1,2 order by 3, 4, 2, 1 limit 5; listid | eventid | revenue | numtix -------+---------+---------+-------- 89397 | 47 | 20.00 | 1 106590 | 76 | 20.00 | 1 124683 | 393 | 20.00 | 1 103037 | 403 | 20.00 | 1 147685 | 429 | 20.00 | 1 (5 rows)
- ALL
-
ALL 表示按照在 SELECT 列表中指定的所有列进行分组,但聚合的列除外。例如,考虑以下查询,该查询按
col1
和col2
分组,而不必在 GROUP BY 子句中单独指定它们。列col3
是SUM
函数的参数,因此不进行分组。SELECT col1, col2 sum(col3) FROM testtable GROUP BY ALL
如果您在 SELECT 列表中 EXCLUDE 某列,则 GROUP BY ALL 子句不会根据该特定列对结果进行分组。
SELECT * EXCLUDE col3 FROM testtable GROUP BY ALL
- aggregation_extension
-
您可以使用聚合扩展 GROUPING SETS、ROLLUP 和 CUBE 在单个语句中执行多个 GROUP BY 操作的工作。有关聚合扩展和相关函数的更多信息,请参阅聚合扩展。
示例
下面的示例使用包含以下各列的 SALES 表:salesid、listid、sellerid、buyerid、eventid、dateid、qtysold、pricepaid、commission 和 saletime。有关 SALES 表的更多信息,请参阅示例数据库。
以下示例查询按 salesid
和 listid
分组,而不必在 GROUP BY 子句中单独指定它们。列 qtysold
是 SUM
函数的参数,因此不进行分组。
SELECT salesid, listid, sum(qtysold) FROM sales GROUP BY ALL;
salesid | listid | sum --------+---------+------ 33095 | 36572 | 2 88268 | 100813 | 4 110917 | 127048 | 1 ...
以下示例查询排除 SELECT 列表中的若干列,因此 GROUP BY ALL 仅对 salesid 和 listid 进行分组。
SELECT * EXCLUDE sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, saletime FROM sales GROUP BY ALL;
salesid | listid --------+--------- 33095 | 36572 88268 | 100813 110917 | 127048 ...