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优化一键生成指南
微信小程序 五星评分(包括半颗星评分)实例代码


