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

ROWS 与 RANGE 帧的区别

窗口帧决定函数看哪些行:ROWS 按物理行数,RANGE 按排序值的区间(并列值会一起进来);省略时默认 RANGE。

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

对比

对比
-- ROWS:严格最近 2 行
SELECT dt, sales,
       SUM(sales) OVER (ORDER BY dt
                        ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS s_rows
FROM daily_sales;

-- RANGE:排序值相同(同一天多行)会全部计入
SELECT dt, sales,
       SUM(sales) OVER (ORDER BY dt
                        RANGE BETWEEN 1 PRECEDING AND CURRENT ROW) AS s_range
FROM daily_sales;
ROWS按行偏移,逐行累计常用
RANGE按值偏移,并列值整组进入帧
常用帧UNBOUNDED PRECEDING / n PRECEDING / CURRENT ROW / FOLLOWING

易错点

  • 用 RANGE 做逐行累计时,并列行会得到相同累计值(它们互相可见),与预期不符时改 ROWS
  • 帧里用数字偏移(RANGE 1 PRECEDING)要求排序列可做算术,日期/字符串场景通常不可用

数据来源与参考

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