GROUP BY
子句指定了在 SELECT
子句中执行任何聚合时应使用的分组列。
如果指定了 GROUP BY
子句,即使 SELECT
子句中没有聚合操作,查询也始终是一个聚合查询。
当指定了GROUP BY
子句时,所有在分组列中具有匹配数据的元组(即属于同一组的所有元组)将被合并。
分组列本身的值保持不变,其他列可以使用聚合函数(如count
、sum
、avg
等)进行合并。
GROUP BY ALL
使用 GROUP BY ALL
来对 SELECT
语句中未包含在聚合函数中的所有列进行 GROUP BY
。
这通过允许在单个位置维护列列表来简化语法,并通过保持 SELECT
粒度与 GROUP BY
粒度一致来防止错误(例如,防止重复)。
请参阅下面的示例以及 “使用 DuckDB 编写更友好的 SQL”博客文章 中的其他示例。
多维度
通常情况下,GROUP BY
子句沿单一维度进行分组。
使用 GROUPING SETS
, CUBE
或 ROLLUP
子句 可以沿多个维度进行分组。
更多信息请参见 GROUPING SETS
页面。
Examples
计算属于每个不同城市的addresses
表中的条目数量:
SELECT city, count(*)
FROM addresses
GROUP BY city;
计算每个城市每条街道的平均收入:
SELECT city, street_name, avg(income)
FROM addresses
GROUP BY city, street_name;
GROUP BY ALL
示例
按城市和街道名称分组以删除任何重复值:
SELECT city, street_name
FROM addresses
GROUP BY ALL;
计算每个城市每条街道的平均收入。由于收入被包裹在聚合函数中,不要将其包含在GROUP BY
中:
SELECT city, street_name, avg(income)
FROM addresses
GROUP BY ALL;
-- GROUP BY city, street_name: