当前位置: 首页 > web >正文

大数据学习(126)-窗口函数范围

🍋🍋大数据学习🍋🍋

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


在 SQL 中,窗口范围(Window Frame)通过 OVER 子句的 RANGEROWS 或 GROUPS 关键字定义,用于确定聚合函数操作的数据子集。以下是详细解析:

核心语法

<聚合函数> OVER (PARTITION BY ...ORDER BY ...<窗口范围>  -- 定义聚合的具体数据范围
)

窗口范围的三种模式

1. ROWS 模式

基于 物理行号 确定范围,不考虑值的差异。

ROWS BETWEEN <开始> AND <结束>
  • 示例
    ROWS BETWEEN 3 PRECEDING AND CURRENT ROW  -- 当前行及其前3行(共4行)
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  -- 从第一行到当前行
    ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING  -- 当前行+前一行+后一行(共3行)
    
2. RANGE 模式

基于 逻辑值范围 确定范围,适用于日期、数值等有序字段。

RANGE BETWEEN <开始> AND <结束>

示例(日期字段):

RANGE BETWEEN INTERVAL '7 DAY' PRECEDING AND CURRENT ROW  -- 当前日期及前7天
RANGE BETWEEN 10 PRECEDING AND 10 FOLLOWING  -- 当前值±10的范围(数值字段)
3. GROUPS 模式(较少使用)

基于 排序后的分组 确定范围,需配合 ORDER BY 使用。

GROUPS BETWEEN <开始> AND <结束>

示例

GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW  -- 当前分组及其前一个分组

边界关键字详解

关键字含义适用模式
UNBOUNDED PRECEDING从分区的第一行 / 第一个值开始ROWSRANGE
UNBOUNDED FOLLOWING到分区的最后一行 / 最后一个值结束ROWSRANGE
CURRENT ROW当前行 / 当前值所有模式
N PRECEDING当前行 / 值的前 N 行 / 值(N 为数字)所有模式
N FOLLOWING当前行 / 值的后 N 行 / 值(N 为数字)所有模式
INTERVAL '...' PRECEDING当前日期 / 时间的前 N 个时间单位RANGE
INTERVAL '...' FOLLOWING当前日期 / 时间的后 N 个时间单位RANGE

常见组合示例

1. 计算移动平均值(7 天滚动)
AVG(amount) OVER (PARTITION BY user_idORDER BY order_dateRANGE BETWEEN INTERVAL '6 DAY' PRECEDING AND CURRENT ROW  -- 近7天(含当天)
)
2. 累计求和(截至当前行)
SUM(amount) OVER (PARTITION BY user_idORDER BY order_dateROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  -- 从第一行到当前行
)
3. 当前行及前后各一行
MAX(amount) OVER (ORDER BY order_dateROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING  -- 共3行
)

模式选择建议

场景推荐模式示例
按时间窗口聚合RANGERANGE BETWEEN INTERVAL '30 DAY' PRECEDING AND CURRENT ROW
按固定记录数聚合ROWSROWS BETWEEN 9 PRECEDING AND CURRENT ROW(计算近 10 行的平均值)
按分组聚合GROUPSGROUPS BETWEEN 2 PRECEDING AND CURRENT ROW(计算当前组及前两组)
累计计算(从开始到当前)ROWSROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

注意事项

  1. ORDER BY 必须存在
    RANGE 和 GROUPS 模式依赖排序,若无 ORDER BY,窗口范围默认为 UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

  2. RANGE 的特殊规则

    • 若排序字段有重复值,RANGE 会将相同值视为同一窗口。例如:
      ORDER BY score  -- 若两行 score 均为 80,它们的窗口范围相同
      
  3. 默认窗口范围
    若省略窗口范围,SQL 默认使用:

    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  -- 累计模式
    

总结

窗口范围的选择取决于业务需求:

  • 时间 / 数值逻辑范围 → RANGE
  • 固定行数 → ROWS
  • 分组聚合 → GROUPS
http://www.xdnf.cn/news/10472.html

相关文章:

  • 通过WiFi无线连接小米手机摄像头到电脑的方法
  • AI炼丹日志-27 - Anubis 通过 PoW工作量证明的反爬虫组件 上手指南 原理解析
  • Java数值处理常见错误解析
  • java多线程与JUC
  • nt!MiDispatchFault函数分析之nt!MiCompleteProtoPteFault函数的作用
  • sqli-labs靶场32-37关(宽字节注入)
  • 历年苏州大学计算机保研上机真题
  • 语音转文字工具
  • Git 入门学习教程
  • Redis 缓存穿透、缓存击穿、缓存雪崩详解与解决方案
  • Ansible 进阶 - Roles 与 Inventory 的高效组织
  • uni-app学习笔记十八--uni-app static目录简介
  • YOLOv5-入门篇笔记
  • 算法打开13天
  • 焦虑而烦躁的上午
  • HTTPS
  • VeriFree:无需Verifier的通用RL框架
  • 【GPT入门】第40课 vllm与ollama特性对比,与模型部署
  • wsl安装linux
  • 测试总结(二)
  • Python 验证码识别(使用pytesseract库)
  • JVM——JVM运行时数据区的内部机制是怎样的?
  • unix/linux source 命令,在当前的 Shell 会话中读取并执行指定文件中的命令
  • 【AI学习】检索增强生成(Retrieval Augmented Generation,RAG)
  • Vue拖拽组件:vue-draggable-plus
  • 神经网络与Transformer详解
  • Ansible 剧本精粹 - 编写你的第一个 Playbook
  • Spring Boot 4.0实战:构建高并发电商系统
  • 通过内核寄存器排除HardFault
  • uni-app学习笔记十七-css和scss的使用