窗口函数
概述
窗口函数在一组相关行上执行计算,同时为每个输入行返回一个结果。与聚合函数不同,窗口函数不会将多行折叠为单个输出。
主要特性:
- 在与当前行相关的“窗口”行集上执行操作
- 为每个输入行返回一个值(不进行分组/折叠)
- 可以访问窗口中其他行的值
- 支持分区和排序,以实现灵活的计算
关于本文档中 SQL 示例的说明:
- ✅ 完整 SQL 语句 已在 TiDB Cloud Lake 上验证
- ⚠️ 语法示例 展示的是窗口框架模式(不是完整语句)
- 📋 所有示例均使用 TiDB Cloud Lake 支持的标准 SQL 语法
- 🔍 标记为“Complete example”的示例可直接完整执行
窗口函数类别
TiDB Cloud Lake 支持两大类窗口函数:
1. 专用窗口函数
这些函数专门为窗口操作设计。
排名函数:
分布函数:
值访问函数:
别名:
2. 作为窗口函数使用的聚合函数
这些是标准聚合函数,可以与 OVER 子句一起使用以执行窗口操作。
条件变体
基本语法
所有窗口函数都遵循以下模式:
FUNCTION() OVER (
[ PARTITION BY column ]
[ ORDER BY column ]
[ window_frame ]
)
- PARTITION BY:将数据划分为多个组
- ORDER BY:对每个分区内的行进行排序
- window_frame:定义要包含哪些行(可选)
窗口框架说明
窗口框架定义了对每一行进行计算时应包含哪些行。TiDB Cloud Lake 支持两种类型的窗口框架:
1. ROWS BETWEEN
使用物理行数定义窗口框架。
语法:
ROWS BETWEEN frame_start AND frame_end
示例:
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW- 运行总计ROWS BETWEEN 2 PRECEDING AND CURRENT ROW- 3 天移动平均ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING- 居中窗口
有关详细示例和用法,请参见 ROWS BETWEEN。
2. RANGE BETWEEN
使用逻辑值范围定义窗口框架。
语法:
RANGE BETWEEN frame_start AND frame_end
示例:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW- 按值累积RANGE BETWEEN INTERVAL '7' DAY PRECEDING AND CURRENT ROW- 7 天窗口
有关详细示例和用法,请参见 RANGE BETWEEN。
常见使用场景
- 排名:创建排行榜和 Top-N 列表
- 分析:计算运行总计、移动平均、百分位数
- 比较:比较当前值与前一个/后一个值
- 分组:在不丢失明细的情况下将数据划分为多个存储桶
有关详细语法和示例,请参见上方各个函数的单独文档。