SELECT函数式字段是否需纳入GROUP BY?缩减GROUP BY字段能否正常运行?
问题1:SELECT子句中以函数形式定义的所有字段是否都需要在GROUP BY子句中进行引用?
不是所有函数定义的字段都要加入GROUP BY,得区分函数类型:
- 聚合函数(比如示例里的
COUNT()、AVG()、ROUND()):这类是基于分组做统计计算的,完全不需要出现在GROUP BY里,它们本身就是分组后的计算结果。 - 普通函数(比如示例里的
CONCAT()):如果这类函数是用非聚合字段生成的,那它依赖的底层字段要么得被包含在GROUP BY里,要么你直接把整个函数表达式放到GROUP BY中。本质是:分组后每个组里的这个函数结果得是唯一确定的,不能出现多种可能。
问题2:若GROUP BY子句未包含全部3个字段,比如仅保留
GROUP BY start_station_name,以下SQL代码能否正常运行? 不能正常运行。
原因很直接:SELECT里的usertype、start_station_name、end_station_name(被用在CONCAT()生成route字段)都是非聚合字段。当你只按start_station_name分组时,同一个分组里可能存在多个不同的usertype和end_station_name,数据库没法确定要返回哪个值,会直接抛出语法错误。
内容的提问来源于stack exchange,提问作者elof
相关产品推荐
相关产品推荐

