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

窗口函数的使用限制

窗口函数只能出现在 SELECT 列表与 ORDER BY 中:WHERE、GROUP BY、HAVING 里不能用;要筛选计算结果必须套子查询。

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

常见报错与改写

常见报错与改写
-- 错误:窗口函数不能出现在 WHERE
SELECT * FROM (
    SELECT o.*, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at) AS rn
    FROM orders o
) x
WHERE rn = 1;   -- 正确:外层过滤

-- 错误示例(不要这样写):
-- SELECT * FROM orders WHERE ROW_NUMBER() OVER (...) = 1;
允许位置SELECT 列表、ORDER BY
禁止位置WHERE / GROUP BY / HAVING
MySQL 8 附加限制窗口函数不能用于 UPDATE/DELETE 的 SET 子句

易错点

  • 逻辑执行顺序:WHERE → GROUP BY → HAVING → 窗口函数 → ORDER BY,把窗口结果当过滤条件必须包一层
  • MySQL 8 中窗口函数与部分语句组合受限,迁移写法前先在目标版本验证

数据来源与参考

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