SQL中GROUP BY函数的适用场景及使用必要性答疑
为什么要用GROUP BY?
简单说,GROUP BY就是把数据按你指定的规则分成一个个独立的小组,让count、avg这类聚合函数,针对每个小组单独计算结果,而不是对着整个数据库表算一个笼统的总数。
拿你给的查询例子拆解来看:
你要统计不同用户类型、不同骑行路线的出行次数和平均时长,就得先把数据分组:
- GROUP BY后面的
start_station_name, end_station_name, usertype,意思是把所有骑行记录,按「用户类型+起点站+终点站」的组合来分组。比如“会员用户从华盛顿广场公园到联合广场”是一个组,“普通用户从联合广场到华盛顿广场公园”是另一个组,每个组里的这三个字段值完全一致。
再看SELECT里的内容:
usertype和拼出来的route:这些都是分组的依据字段,每个组里它们的值是统一的,所以可以直接作为每个组的“标签”展示出来。count(*) as num_trips:统计当前这个小组里有多少条骑行记录,也就是这个「用户类型+路线」组合被使用的总次数。round(avg(cast(tripduration AS int64)/60),2) as duration:计算这个小组里所有骑行的平均时长(转换成分钟并保留两位小数)。
如果不用GROUP BY,count(*)会算出整个表的总骑行次数,avg(...)会算出所有骑行的平均时长,根本得不到你想要的“分用户、分路线”的细分统计结果——这就是为什么用聚合函数必须搭配GROUP BY的核心原因:你得告诉SQL,要按什么规则拆分数据,再对每个拆分后的小组做聚合计算。
另外要注意一个规则:SELECT里出现的非聚合函数的字段,必须都出现在GROUP BY里(像你例子里的usertype、start_station_name、end_station_name都在GROUP BY里,就符合要求)。
内容的提问来源于stack exchange,提问作者kazi jubair Radin
相关产品推荐
相关产品推荐

