SQL中GROUP BY使用位置引用时SELECT含非聚合函数的原理疑问
关于GROUP BY位置引用与SELECT中非聚合CASE语句的执行疑问
先看你提到的SQL代码:
SELECT CASE WHEN year = 'FR' THEN 'FR' WHEN year = 'SO' THEN 'SO' WHEN year = 'JR' THEN 'JR' WHEN year = 'SR' THEN 'SR' ELSE 'No Year Data' END AS year_group, COUNT(1) AS count FROM benn.college_football_players GROUP BY 1
你疑惑的核心是对GROUP BY规则的理解偏差,具体解释如下:
GROUP BY 1的实际作用:这里的数字
1是SELECT子句输出列的位置引用,代表引用第1个输出列——也就是那个CASE表达式生成的year_group。本质上和把整个CASE语句完整写在GROUP BY里是等价的,即:GROUP BY CASE WHEN year = 'FR' THEN 'FR' WHEN year = 'SO' THEN 'SO' WHEN year = 'JR' THEN 'JR' WHEN year = 'SR' THEN 'SR' ELSE 'No Year Data' END为什么CASE可以出现在SELECT中:SQL规则里,SELECT子句允许直接出现分组键本身,而不只是聚合函数或函数依赖列。这个CASE表达式就是分组的依据——每组内的所有行经过CASE计算后得到的
year_group值完全相同,属于分组键范畴,自然可以直接在SELECT里输出,再搭配聚合函数COUNT(1)统计每组的行数,完全符合SQL的分组逻辑。补充说明:这种位置引用的写法是多数SQL数据库(如PostgreSQL、MySQL、BigQuery等)支持的简化语法,目的是避免重复书写冗长的表达式,提升代码简洁度。
内容的提问来源于stack exchange,提问作者P.Jo
相关产品推荐
相关产品推荐

