SQL如何对比当前记录与整体均值_窗口函数AVG的应用实践

张开发
2026/4/18 17:53:11 15 分钟阅读

分享文章

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 不支持旧版 MySQLAVG(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语音服务的人工智能开放平台

更多文章