SQL 窗口函数中的 ROWS 与 RANGE 区别

发布时间 - 2026-01-21 00:00:00    点击率:
ROWS按物理行数定义窗口,RANGE按排序值逻辑范围定义窗口;ROWS严格计数行号,RANGE聚合同值组并按值域扩展,选型依“固定数量”或“值域区间”需求而定。

ROWS 和 RANGE 都是用来定义窗口函数中“当前行的邻居范围”,但它们的划分逻辑完全不同:ROWS 按物理行数切分,RANGE 按排序值的逻辑范围切分。

ROWS 是按行号计数的“固定长度滑动窗口”

ROWS 严格依据 ORDER BY 后的排序结果,从当前行出发,向上(PRECEDING)或向下(FOLLOWING)数指定数量的物理行。即使这些行的排序值相同,也各自独立计数。

  • 例如 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING 总是取当前行前后各 1 行,共 3 行,不管这三行的 ORDER BY 列值是否相等
  • 如果当前行是第 5 行,且前面有重复值,ROWS 仍只拉第 4、5、6 行,不会因为第 3 行和第 4 行值相同就多拉一行
  • 适用于需要“最近 N 笔交易”“前后 N 天记录”这类明确数量控制的场景

RANGE 是按排序值分组的“值域区间窗口”

RANGE 把 ORDER BY 列中值相等的所有行视为一个逻辑单元(即“同值组”),然后以当前行的排序值为中心,向左右扩展指定的值范围(需配合 UNBOUNDED 或数字常量使用),所有落在该值范围内的行都会被纳入窗口。

  • 例如 RANGE BETWEEN 10 PRECEDING AND CURRENT ROW 表示:取排序列值在 [当前行值 − 10, 当前行值] 区间内的所有行
  • 若 ORDER BY 列是金额,当前行为 100,则会包含所有金额在 90 到 100 之间的行(哪怕有 20 行都等于 95,全算进来)
  • 注意:RANGE 默认仅支持 ORDER BY 单一数值列(如 INT/FLOAT/DATE),不支持字符串或多个列

当 ORDER BY 值重复时,ROWS 和 RANGE 行为差异最明显

假设有以下按 score 排序的数据:

id | score
1  | 80
2  | 85
3  | 85
4  | 85
5  | 90

对每一行计算 COUNT(*) OVER (ORDER BY score ...)

  • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:每行的计数依次是 1,2,3,4,5(严格按行号累加)
  • RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:第 1 行得 1;第 2–4 行(scor

    e=85)都看到“从最小值到 85”的全部行,结果都是 4;第 5 行才变成 5

实际选型建议

  • 要“取最近 3 条记录”,选 ROWS;要“取价格相差不超过 5 的所有商品”,选 RANGE
  • 涉及时间字段(如 order_date)时,ROWS 不适合表达“过去 7 天”,而 RANGE 可写 RANGE BETWEEN INTERVAL '7 days' PRECEDING AND CURRENT ROW(PostgreSQL/Oracle 支持,MySQL 8.0+ 对 DATE 类型有限支持)
  • 默认框架(未显式写 ROWS/RANGE)在多数数据库中等价于 RANGE UNBOUNDED PRECEDING,这点容易踩坑,建议始终显式声明


# mysql  # oracle  # win  # 区别  # sql  # Float  # 常量  # count  # date  # 字符串  # int  # postgresql  # 数据库  # 行号  # 值域  # 都是  # 切分  # 多拉  # 行数  # 多个  # 适用于  # 这类  # 落在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  html如何与html链接_实现多个HTML页面互相链接【互相】  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  JS实现鼠标移上去显示图片或微信二维码  iOS发送验证码倒计时应用  如何快速打造个性化非模板自助建站?  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  高端建站三要素:定制模板、企业官网与响应式设计优化  JavaScript如何实现继承_有哪些常用方法  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Android滚轮选择时间控件使用详解  简历没回改:利用AI润色让你的文字更专业  ,交易猫的商品怎么发布到网站上去?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何快速配置高效服务器建站软件?  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  Laravel如何使用Blade组件和插槽?(Component代码示例)  Laravel如何使用Blade模板引擎?(完整语法和示例)  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  浅谈javascript alert和confirm的美化  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  php json中文编码为null的解决办法  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  昵图网官方站入口 昵图网素材图库官网入口  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Laravel如何实现数据库事务?(DB Facade示例)  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  LinuxShell函数封装方法_脚本复用设计思路【教程】  大型企业网站制作流程,做网站需要注册公司吗?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  JS中对数组元素进行增删改移的方法总结  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Laravel如何实现API速率限制?(Rate Limiting教程)  魔毅自助建站系统:模板定制与SEO优化一键生成指南  微信小程序 五星评分(包括半颗星评分)实例代码