首页/数据/SQL 速查/窗口函数与 GROUP BY 的选择
本包目录(311 条)
查询基础33 条连接与子查询40 条
聚合与窗口函数54 条
函数速查60 条变更与事务52 条性能与执行计划72 条

窗口函数与 GROUP BY 的选择

需要保留明细行、做组内对比时用窗口函数;只需要每组的汇总值时用 GROUP BY 更直接。

SQL 速查数据更新于 2026-10-12

对比

对比
-- GROUP BY:每组一行汇总
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id;

-- 窗口函数:保留每行,附带组内均值用于对比
SELECT id, dept_id, salary,
       AVG(salary) OVER (PARTITION BY dept_id) AS avg_salary,
       salary - AVG(salary) OVER (PARTITION BY dept_id) AS diff
FROM employees;
GROUP BY输出行数 = 组数
OVER输出行数 = 明细行数
组合两类可写在同一查询(不同层级),注意语义

易错点

  • 窗口函数与聚合函数同名(SUM/AVG),带 OVER 才是窗口用法,漏写 OVER 含义完全不同
  • 两者混用时聚合先算、窗口后算,嵌套层级搞错会报错或结果不符

数据来源与参考

  • MySQL 8.0 Reference Manual · Window Functions
  • PostgreSQL Documentation · Window Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌