如何以非冗余方式实现GROUP BY与ORDER BY使用相同列集?
方案1:用位置指代排序字段(兼容性最佳)
绝大多数主流数据库都支持按SELECT列表的字段位置指定排序规则,你原查询中A、B是SELECT列表的第1、2个字段,直接把ORDER BY子句改成ORDER BY 1, 2即可,简化后语句如下:
select A, B, C, AVG(D) from table group by A,B order by 1,2
这种写法和你原写法逻辑完全等价,兼容MySQL、PostgreSQL、SQLite、Oracle等绝大多数数据库,是最稳妥的简化方案。
方案2:省略ORDER BY子句(仅部分数据库适用)
部分数据库(比如MySQL、Presto)默认会对GROUP BY的结果按分组字段顺序排序,这种场景下你可以直接删掉ORDER BY子句,结果顺序和原写法一致。
不过要注意:这个行为不是SQL标准的强制要求,PostgreSQL等数据库就没有这个默认逻辑,GROUP BY后的结果顺序不做保证,如果你的业务对结果顺序有严格要求,不建议用这个方案。
额外提醒:你当前的查询在标准SQL模式下会执行报错,因为SELECT列表里的C字段既没有出现在GROUP BY子句中,也没有被聚合函数包裹,只有MySQL关闭了ONLY_FULL_GROUP_BY校验的场景下才能运行,但此时返回的C值是随机匹配的,不符合预期,建议你根据实际业务需求调整,要么把C加到GROUP BY列表里,要么对C使用MAX()/MIN()等聚合函数。
内容的提问来源于stack exchange,提问作者Chaitanya Bapat
相关产品推荐
相关产品推荐

