GROUP BY 子句
GROUP BY 子句用于指定在 SELECT 子句中执行聚合时应使用哪些分组列。
如果指定了 GROUP BY 子句,该查询始终是聚合查询,即使 SELECT 子句中没有出现聚合函数也是如此。
当指定 GROUP BY 子句后,分组列数据相同的所有元组(即同一组内的所有元组)会被合并处理。
分组列本身的值保持不变,其他列可以通过聚合函数(如 count、sum、avg 等)进行合并。
GROUP BY ALL
使用 GROUP BY ALL 可对 SELECT 语句中所有未被聚合函数包裹的列进行 GROUP BY。
这种方式可将列清单只维护在一个位置,从而简化语法;同时让 SELECT 粒度与 GROUP BY 粒度保持一致,避免出现 bug(例如重复行)。
可参考下方示例,以及 “Friendlier SQL with Goose” 博客文章中的更多示例。
多维分组
通常,GROUP BY 子句只沿单一维度分组。
使用 GROUPING SETS、CUBE 或 ROLLUP 子句 可以沿多个维度分组。
更多信息请参见 GROUPING SETS 页面。
示例
统计 addresses 表中每个不同城市对应的记录数:
SELECT city, count(*)
FROM addresses
GROUP BY city;
按城市与 street_name 计算平均收入:
SELECT city, street_name, avg(income)
FROM addresses
GROUP BY city, street_name;
GROUP BY ALL 示例
按 city 和 street_name 分组以去除重复值:
SELECT city, street_name
FROM addresses
GROUP BY ALL;
按城市与 street_name 计算平均收入。由于 income 被聚合函数包裹,不应将其包含在 GROUP BY 中:
SELECT city, street_name, avg(income)
FROM addresses
GROUP BY ALL;
-- GROUP BY city, street_name: