🍋🍋大数据学习🍋🍋

🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞


在SQL窗口函数中,RANGE BETWEEN ... AND ... 和 ROWS BETWEEN ... AND ... 都用于定义窗口框架(window frame),但它们在确定窗口范围的方式上有重要区别。

ROWS BETWEEN ... AND ...

  • 基于物理行:根据结果集中的物理行位置确定窗口范围
  • 固定行数:指定的是当前行之前或之后的固定行数
  • 不关心值:不考虑行的实际值,只关心它们在结果集中的位置
  • 性能较好:通常计算成本较低,因为不需要比较值
-- 当前行、前一行和后一行
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING


-- 前10行到当前行
ROWS BETWEEN 10 PRECEDING AND CURRENT ROW

RANGE BETWEEN ... AND ...

  • 基于值范围:根据指定列的值范围确定窗口范围
  • 动态范围:窗口包含所有行,只要它们的值在指定范围内
  • 需要ORDER BY:必须与ORDER BY子句一起使用
  • 可能产生不连续窗口:如果值不连续,可能跳过某些行
  • 性能较低:通常计算成本较高,因为需要比较值
-- 当前行和所有具有相同值的行
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW


-- 当前日期和前3天的数据(假设按日期排序)
RANGE BETWEEN INTERVAL '3' DAY PRECEDING AND CURRENT ROW

主要区别

特性 ROWS BETWEEN RANGE BETWEEN
基础 物理行位置 列值范围
是否需要ORDER BY 不需要 必须
窗口连续性 总是连续的 可能不连续
性能 通常更高 通常更低
适用场景 行数固定的计算 基于值的范围计算

使用建议

  • 当需要基于固定行数进行计算时(如移动平均),使用ROWS
  • 当需要基于值范围进行计算时(如日期范围),使用RANGE
  • 注意RANGE在某些数据库中的实现可能有限制
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐