PostgreSQL主键内连接查询异常及分组问题求助
解决你的SQL分组与关联问题
嘿,我来帮你拆解并解决这两个SQL问题,其实核心是语法顺序和分组逻辑的问题,咱们一步步来:
问题1:WHERE子句位置错误导致报错
你原语句里把WHERE amount IS NOT NULL放在INNER JOIN前面,这是SQL语法顺序错误!SQL的执行逻辑是先处理FROM和JOIN关联表,再用WHERE过滤数据,最后才是GROUP BY分组。把WHERE放在JOIN之前,数据库根本无法识别正确的执行顺序,所以移除WHERE后语句能运行,但咱们其实不需要丢这个过滤条件,只要调整位置就行。
问题2:分组逻辑不符合需求
你想要的是每个id每年的平均amount,那分组条件必须同时包含id和year——因为单个id可能对应多个年份的记录,只按id分组会把这个id所有年份的amount混在一起算平均;只按year分组则是所有id同一年的平均,都不是你要的结果。只有同时按id和year分组,每个分组才是「某id在某一年」的记录集合,计算出的平均值才是目标结果。
正确的SQL语句
结合上面两个修正点,最终的查询语句应该是这样的:
SELECT table1.id, table1.year, AVG(table1.amount) AS avg_amount FROM table1 INNER JOIN table2 ON table1.id = table2.id WHERE table1.amount IS NOT NULL GROUP BY table1.id, table1.year;
额外说明:
- 我给聚合结果加了别名
avg_amount,方便你后续引用这个平均值; - 明确指定了表名(比如
table1.id),避免两张表都有id字段时出现歧义; - 如果
table2里存在重复的id记录,INNER JOIN可能会导致table1的同一条记录被重复关联,进而影响平均值计算。这种情况下可以改用EXISTS来关联,只检查id的存在性,避免重复统计:
SELECT table1.id, table1.year, AVG(table1.amount) AS avg_amount FROM table1 WHERE table1.amount IS NOT NULL AND EXISTS (SELECT 1 FROM table2 WHERE table2.id = table1.id) GROUP BY table1.id, table1.year;
内容的提问来源于stack exchange,提问作者user6754289
相关产品推荐
相关产品推荐

