PostgreSQL中使用GROUP BY遇到问题,请求技术解答
解决PostgreSQL GROUP BY统计平行班数量的问题
我来帮你分析下这个问题哈~
原语句的问题所在
你当前执行的SQL:
select id_curso, count(distinct paralelo) from clase group by id_curso, paralelo having count(distinct paralelo)>=1
核心问题出在GROUP BY的分组键上:你同时用了id_curso和paralelo作为分组依据,这意味着数据会被拆分成(id_curso, paralelo)的唯一组合分组。在每个这样的分组里,paralelo的值是唯一的(因为分组键已经包含它了),所以count(distinct paralelo)的结果必然是1,再加上having条件>=1,最终会返回所有(id_curso, paralelo)的组合,这显然不是你想要的统计每个课程下平行班数量的效果。
正确的SQL写法
你的需求应该是按课程ID(id_curso)分组,统计每个课程对应的不同平行班数量。调整后的SQL如下:
select id_curso, count(distinct paralelo) as num_paralelos from clase group by id_curso
补充说明:
- 这里只需要按
id_curso分组,这样每个分组会包含该课程下的所有平行班数据,count(distinct paralelo)就能统计出该课程的不同平行班数量。 having count(distinct paralelo)>=1这个条件可以省略,因为只要课程存在至少一条记录,统计结果就会>=1;如果需要过滤掉没有任何平行班的课程(你的数据里不存在这种情况),可以保留该条件。
优化写法(可选)
从你插入的数据来看,(id_curso, paralelo)的组合是唯一的(每个课程的每个平行班只有一条记录),这种情况下可以不用distinct,直接用count(*)或者count(paralelo),结果一致且性能更好:
select id_curso, count(*) as num_paralelos from clase group by id_curso
执行结果验证
根据你提供的测试数据,执行上述正确语句后会得到符合预期的结果:
| id_curso | num_paralelos |
|---|---|
| 1 | 1 |
| 2 | 2 |
内容的提问来源于stack exchange,提问作者Ask_Ay
相关产品推荐
相关产品推荐

