SQL在GROUP BY中如何保留非聚合列_配合ANY_VALUE或窗口函数

应使用ANY_VALUE()显式声明非确定性取值,或用窗口函数实现"每组取最新一条"等明确逻辑,避免关闭ONLY_FULL_GROUP_BY导致数据不可靠。MySQL 8.0+ 中 GROUP BY 报错 "Expression #1 of SELECT list is not in GROUP BY clause" 怎么办这是 MySQL 严格模式下的典型报错,本质不是语法错误,而是 SQL 模式(sql_mode)拒绝"非确定性选择"。比如你写了 SELECT id, name, COUNT(*) FROM users GROUP BY dept,id 和 name 没聚合也没出现在 GROUP BY 里,MySQL 不知道该取哪一行的值。最直接的解法是关掉 ONLY_FULL_GROUP_BY ------ 但不推荐。它掩盖问题,上线后可能返回任意行,查到的数据不可靠。用 ANY_VALUE() 显式声明"我就要随便取一个",语义清晰,兼容 MySQL 5.7.5+用窗口函数(如 ROW_NUMBER() OVER (PARTITION BY dept ORDER BY created_at DESC))先排序再过滤,适合"每组取最新一条"这类明确逻辑如果只是想查分组统计 + 某个代表值(比如部门负责人),建议提前在子查询或 CTE 里把代表值算好,再和分组结果 JOINANY_VALUE() 看似简单,但容易忽略的三个行为细节ANY_VALUE() 不是随机函数,也不是取首行,它是"优化器自由选择的一行值"------具体选哪行取决于执行计划、索引、数据分布,甚至 MySQL 版本升级都可能变。所以它只适用于你真不在乎是哪一行的场景。不能用于主键或唯一列的"去重替代",比如 ANY_VALUE(id) 在 GROUP BY name 下可能返回任意匹配的 id,无法保证一致性和 ORDER BY 同时用没意义:SELECT ANY_VALUE(name) FROM t GROUP BY dept ORDER BY dept 中的 ORDER BY 不影响 ANY_VALUE() 的取值在视图或物化查询中使用时,如果底层表加了索引,ANY_VALUE() 可能稳定返回索引顺序的第一行,但这属于实现细节,不应依赖想"每组取最新一条",为什么别硬套 ANY_VALUE() 而要用窗口函数因为 ANY_VALUE() 解决不了"按时间/优先级选"的需求。例如"每个部门最新入职的员工",ANY_VALUE() 可能返回三年前的老员工,而你要的是 created_at 最大的那条。窗口函数才是正解: 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

相关推荐
幻风_huanfeng2 分钟前
软考:高级软件架构师学习笔记----数据库
数据库·软考·系统架构师
名字还没想好☜6 分钟前
用 Python struct 解析二进制协议:pack/unpack、字节序与对齐踩坑
开发语言·python·二进制·struct
衿心.12 分钟前
Django TemplateDoesNotExist
数据库·django·sqlite
方便面不加香菜20 分钟前
MySQL 复合查询
数据库·mysql
花花鱼23 分钟前
MySQL Illegal mix of collations 全解|字符集与排序规则冲突原理、分层排错、通用解决方案(适配5.7/8.0迁移)
数据库·mysql
Wang's Blog32 分钟前
PostgreSQL笔记37:数据库性能瓶颈排查方法论与工具链
数据库·笔记·postgresql
青 春 记 忆1 小时前
LeetCode 155. 最小栈|Python 解法详解
开发语言·python·leetcode
程序员三藏10 小时前
Python+requests实现接口自动化测试
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
oradh10 小时前
Oracle闪回技术操作总结
数据库·oracle·oracle闪回技术操作总结·oracle闪回·flashback技术
ltl11 小时前
RocksDB 并发 Compaction 与 Rate Limiter
数据库