PostgreSQL 19新特性之GROUP BY ALL
当我们使用 GROUP BY 对数据进行分组统计时,需要列出查询结果中所有不是聚合函数的字段,例如:
SELECT dept_id, job_id, sex, count(*)
FROM employee
GROUP BY dept_id, job_id, sex;
如果 GROUP BY 子句中缺少了某个分组字段,就会返回语法错误,例如:
SELECT dept_id, job_id, sex, count(*)
FROM employee
GROUP BY dept_id, sex;SQL 错误 [42803]: 错误: 字段 "employee.job_id" 必须出现在 GROUP BY 子句中或者在聚合函数中使用
错误本身没有问题,因为不指定 job_id 分组字段的话逻辑上存在问题。查询结果中同一个部门(dept_id)、同一个性别(sex)可以有不同的职位(job),需要分别进行统计。
为了避免每次都需要输入完整的分组字段,PostgreSQL 19 增加了一个新的语法扩展:GROUP BY ALL。例如:
SELECT dept_id, job_id, sex, count(*)
FROM employee
GROUP BY ALL;
这种语法更加简洁,尤其是当分组字段很多的时候。
不仅简单查询支持新的语法,连接查询、子查询等都可以使用。例如:
SELECT d.dept_name, j.job_title, e.sex, count(*)
FROM employee e
JOIN department d ON d.dept_id = e.dept_id
JOIN job j ON j.job_id = e.job_id
GROUP BY ALL;
