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

窗口函数的默认帧

有 ORDER BY 时默认帧是 RANGE UNBOUNDED PRECEDING AND CURRENT ROW;没有 ORDER BY 时是整个分区。这解释了很多“结果和想象不一样”。

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

两种默认

两种默认
-- 无 ORDER BY:整分区求平均,每行相同
SELECT id, dept_id, AVG(salary) OVER (PARTITION BY dept_id) AS dept_avg
FROM employees;

-- 有 ORDER BY:累计到当前行(RANGE 帧)
SELECT id, dept_id, salary,
       AVG(salary) OVER (PARTITION BY dept_id ORDER BY hired_at) AS avg_so_far
FROM employees;
无 ORDER BY帧 = 整个分区
有 ORDER BY帧 = 分区起点到当前行(含并列)
显式写帧结果不确定时明确写出 ROWS/RANGE

易错点

  • 写了 ORDER BY 却想要“全组平均”,会得到累计平均——这是常见的窗口函数误用
  • 默认 RANGE 帧下并列行结果相同,需要逐行差异时改 ROWS

数据来源与参考

  • MySQL 8.0 Reference Manual · Window Function Frames
  • PostgreSQL Documentation · Window Function Calls
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌