为何GROUP BY后SELECT的MAX()未生效?SQL查询问题咨询
SQL错误分析:找出无重复最大数字的问题排查
原语句的执行流程
数据库执行你写的SQL时,步骤是这样的:
- 读取
mynumbers表的所有数据行。 - 按
num字段分组——每个不同的num值单独成为一个分组,比如所有值为1的行会被分到一组,值为6的行(如果只出现一次)单独成组。 - 用
HAVING COUNT(num)=1过滤分组:只保留那些分组内只有一行数据的组,也就是只保留出现过一次的num值对应的分组。 - 对每个通过过滤的分组执行
MAX(num):但每个分组里只有一个num值(因为分组依据就是num,且分组行数为1),所以MAX(num)返回的就是该分组的num值本身。最终结果自然是所有无重复的num列表,而非其中的最大值。
核心问题
你错误地在分组后直接对单个分组取最大值,而没有先收集所有无重复的num,再对这个集合取最大值。
正确写法
方法1:嵌套子查询
先筛选出所有无重复的num,再在外层查询取最大值:
SELECT MAX(num) FROM ( SELECT num FROM mynumbers GROUP BY num HAVING COUNT(num) = 1 ) AS unique_numbers;
方法2:窗口函数(适用于MySQL 8.0+、PostgreSQL等支持窗口函数的数据库)
先给每个num标记出现次数,再筛选出次数为1的num并取最大值:
SELECT MAX(num) AS max_num FROM ( SELECT num, COUNT(*) OVER (PARTITION BY num) AS occurrence_count FROM mynumbers ) AS num_counts WHERE occurrence_count = 1;
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

