SQL如何对比当前记录与整体均值_窗口函数AVG的应用实践
AVG(column) OVER() 是最简写法,必须带空括号,否则报错;混用聚合与窗口函数时,MySQL 8.0+ 和 PostgreSQL 支持,SQLite 及旧版 MySQL 不支持。AVG() OVER() 怎么写才不报错直接在 SELECT 里用 AVG(column) OVER() 是最简方式,但常见错误是忘了加 OVER() 括号——哪怕空着也得有,否则会报 ERROR: window function requires an OVER clause。另外,如果混用普通聚合(如 GROUP BY)和窗口函数,MySQL 8.0+ 和 PostgreSQL 允许,但 SQLite 不支持,旧版 MySQL(AVG(sales) OVER():算全表均值,每行结果一样AVG(sales) OVER(PARTITION BY region):按地区分组算均值,同地区每行值相同别在 WHERE 里引用窗口函数结果,它还没执行;要过滤得用子查询或 CTE对比当前记录和均值:用别名还是子查询想看某条记录比整体均值高多少,直接写 sales - AVG(sales) OVER() 就行,不用先算均值再 JOIN。但注意:浮点精度可能让本该为 0 的差值变成 -0.0000001,尤其涉及金额时建议用 ROUND(..., 2) 控制小数位。推荐写法:sales - ROUND(AVG(sales) OVER(), 2) AS diff_from_avg别用子查询模拟窗口逻辑(比如 (SELECT AVG(sales) FROM t)),性能差且无法做分区均值如果 WHERE 条件已过滤数据,OVER() 算的是过滤后结果集的均值,不是原始全表ORDER BY 在 OVER() 里加不加,结果差很多AVG() OVER(ORDER BY date) 不是“按日期排序后取均值”,而是计算**累积均值**(cumulative average):第一行是第1天的值,第二行是第1–2天的均值,第三行是第1–3天的均值……容易误以为是“滑动窗口”,但它默认是 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。 标贝科技 标贝科技-专业AI语音服务的人工智能开放平台
