SQL使用WHERE过滤字段但无需将其加入GROUP BY的解决方法
问题解决方案
你遇到的问题本质是SQL语法规则要求:SELECT子句中的非聚合字段,必须全部包含在GROUP BY子句中。你只需要用songlength做前置过滤,不需要基于该字段分组统计,对应两种常见场景的最优实现如下:
场景1:统计结果不需要展示songlength字段(最常用场景)
你已经在WHERE子句中完成了时长过滤逻辑,分组聚合仅针对artist维度即可,直接删除SELECT子句中的songlength字段就行。
修改后的正确SQL如下:
SELECT COUNT(songid) AS Plays, artist FROM MyTable WHERE artist = 'Justin' AND songlength > 10000 GROUP BY artist HAVING Plays > 0 ORDER BY Plays DESC
注意:字符串类型的过滤值Justin需要添加单引号,否则会被SQL识别为字段名导致执行报错。
场景2:统计结果需要同步展示songlength的相关指标
如果你需要在统计结果中附带时长相关的统计值(比如平均时长、最长时长等),对songlength使用聚合函数即可,不需要将其加入GROUP BY子句,示例如下:
SELECT COUNT(songid) AS Plays, artist, AVG(songlength) AS avg_song_length, MAX(songlength) AS max_song_length FROM MyTable WHERE artist = 'Justin' AND songlength > 10000 GROUP BY artist HAVING Plays > 0 ORDER BY Plays DESC
内容的提问来源于stack exchange,提问作者Flitschi
相关产品推荐
相关产品推荐

