使用GROUP BY分组查询时如何在结果中包含更多非分组列信息
报错原因
当使用GROUP BY进行分组聚合时,SELECT返回的字段只能是以下两类:
- 包含在GROUP BY子句中的分组字段
- 被SUM/MAX/COUNT等聚合函数包裹的计算字段
你原SQL仅按年、月、日三个字段分组,但SELECT中还返回了origin、dest、flight三个既不在分组字段中、也没有被聚合函数处理的字段,违反了SQL聚合语法规则,因此触发报错。
正确实现方案
你补充的窗口函数写法完全可以满足需求,核心逻辑是通过分区窗口函数替代GROUP BY聚合,避免分组后丢失航班详情字段,也可以用排名函数简化写法,代码如下:
select * from ( select *, round(distance / nullif(air_time, 0) * 60, 2) as speed, -- 按日期分区,按飞行速度倒序排名 rank() over(partition by year, month, day order by distance / nullif(air_time, 0) * 60 desc) as speed_rk from flights ) t where speed_rk = 1;
注:如果单日存在多个航班速度同为最大值,以上写法会返回所有符合条件的航班,符合常规业务需求。
避坑提示
不要直接把origin、dest、flight字段添加到GROUP BY子句中,这种写法会将分组粒度缩小到单个航班维度,最终得到的是每个航班的飞行速度,而不是每日的最大飞行速度对应的航班信息。
内容的提问来源于stack exchange,提问作者CWeeks
相关产品推荐
相关产品推荐

