Postgresql GROUP BY 语句
在 Postgresql 中,GROUP BY 子句用于将查询结果按照一个或多个列进行分组,并对每个组应用聚合函数(如SUM, COUNT, AVG, MAX, MIN等)。GROUP BY 通常与 SELECT 语句一起使用,用于对数据进行汇总和分组统计。
基本语法
SELECT select_list FROM ... [WHERE ...] GROUP BY grouping_column_reference [, grouping_column_reference]...
GROUP BY 子句用于将表中列出的所有列中具有相同值的行分组在一起。列的列出顺序无关紧要。其效果是将具有公共值的每组行合并到一个组行中,该行表示组中的所有行。这样做是为了消除适用于这些组的输出和/或计算聚合中的冗余。
使用示例
假设有一个名为 users 的表,包含user_id, user_name, age, score列,可以如下使用 GROUP BY 子句:
1、按照 age 分组,统计各个年龄段的人数:
SELECT age, COUNT(user_id) FROM users GROUP BY age;
db_name=# SELECT age, COUNT(user_id) db_name-# FROM users db_name-# GROUP BY age; age | count -----+------- 22 | 2 21 | 3 24 | 2 20 | 2 23 | 1 (5 rows)
2、按照 age 分组,统计各个年龄段的积分总和
SELECT age, sum(score) FROM users GROUP BY age;
db_name=# SELECT age, sum(score) db_name-# FROM users db_name-# GROUP BY age; age | sum -----+----- 22 | 194 21 | 287 24 | 179 20 | 172 23 | 99
3、按照 age 分组,统计各个年龄段的积分平均值,并按平均值升序排列
SELECT age, AVG(score) FROM users GROUP BY age order by AVG(score) ASC;
db_name=# SELECT age, AVG(score) db_name-# FROM users db_name-# GROUP BY age db_name-# order by AVG(score) ASC; age | avg -----+--------------------- 20 | 86.0000000000000000 24 | 89.5000000000000000 21 | 95.6666666666666667 22 | 97.0000000000000000 23 | 99.0000000000000000 (5 rows)
注意事项
在GROUP BY子句中列出的每个列必须在SELECT列表中出现,或者是一个聚合函数的参数。
聚合函数应用于每个分组后的结果集,而不是整个表。
如果使用了GROUP BY,则除了聚合函数外的列,每个列的值必须在该组内是唯一的,否则MySQL会返回错误或不确定的结果。