📣
TiDB Cloud Premium 开放公测中。为企业级工作负载提供无限扩展、即时弹性伸缩和高级安全保障。此页面由 AI 自动翻译,英文原文请见此处。

窗口函数



概述

窗口函数在一组相关行上执行计算,同时为每个输入行返回一个结果。与聚合函数不同,窗口函数不会将多行折叠为单个输出。

主要特性:

  • 在与当前行相关的“窗口”行集上执行操作
  • 为每个输入行返回一个值(不进行分组/折叠)
  • 可以访问窗口中其他行的值
  • 支持分区和排序,以实现灵活的计算

关于本文档中 SQL 示例的说明:

  • ✅ 完整 SQL 语句 已在 TiDB Cloud Lake 上验证
  • ⚠️ 语法示例 展示的是窗口框架模式(不是完整语句)
  • 📋 所有示例均使用 TiDB Cloud Lake 支持的标准 SQL 语法
  • 🔍 标记为“Complete example”的示例可直接完整执行

窗口函数类别

TiDB Cloud Lake 支持两大类窗口函数:

1. 专用窗口函数

这些函数专门为窗口操作设计。

排名函数:

Function描述并列值处理示例输出
ROW_NUMBER顺序编号始终唯一1, 2, 3, 4, 5
RANK带间隔的排名相同排名,后续有间隔1, 2, 2, 4, 5
DENSE_RANK不带间隔的排名相同排名,无间隔1, 2, 2, 3, 4

分布函数:

Function描述范围示例输出
PERCENT_RANK以百分比表示的相对排名0.0 到 1.00.0, 0.25, 0.5, 0.75, 1.0
CUME_DIST累积分布0.0 到 1.00.2, 0.4, 0.6, 0.8, 1.0
NTILE划分为 N 个存储桶1 到 N1, 1, 2, 2, 3, 3

值访问函数:

Function描述使用场景
FIRST_VALUE窗口中的第一个值获取最高/最早的值
LAST_VALUE窗口中的最后一个值获取最低/最新的值
NTH_VALUE窗口中的第 N 个值获取特定位置的值
LAG前一行的值与前一行比较
LEAD后一行的值与后一行比较

别名:

函数别名
FIRSTFIRST_VALUE
LASTLAST_VALUE

2. 作为窗口函数使用的聚合函数

这些是标准聚合函数,可以与 OVER 子句一起使用以执行窗口操作。

Function描述支持窗口框架示例
SUM计算窗口上的总和✓SUM(sales) OVER (PARTITION BY region ORDER BY date)
AVG计算窗口上的平均值✓AVG(score) OVER (ORDER BY id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
COUNT统计窗口中的行数✓COUNT(*) OVER (PARTITION BY department)
MIN返回窗口中的最小值✓MIN(price) OVER (PARTITION BY category)
MAX返回窗口中的最大值✓MAX(price) OVER (PARTITION BY category)
ARRAY_AGG将值收集到数组中ARRAY_AGG(product) OVER (PARTITION BY category)
STDDEV_POP总体标准差✓STDDEV_POP(value) OVER (PARTITION BY group)
STDDEV_SAMP样本标准差✓STDDEV_SAMP(value) OVER (PARTITION BY group)
MEDIAN中位数✓MEDIAN(response_time) OVER (PARTITION BY server)

条件变体

Function描述支持窗口框架示例
COUNT_IF条件计数✓COUNT_IF(status = 'complete') OVER (PARTITION BY dept)
SUM_IF条件求和✓SUM_IF(amount, status = 'paid') OVER (PARTITION BY customer)
AVG_IF条件平均值✓AVG_IF(score, passed = true) OVER (PARTITION BY class)
MIN_IF条件最小值✓MIN_IF(temp, location = 'outside') OVER (PARTITION BY day)
MAX_IF条件最大值✓MAX_IF(speed, vehicle = 'car') OVER (PARTITION BY test)

基本语法

所有窗口函数都遵循以下模式:

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 列表
  • 分析:计算运行总计、移动平均、百分位数
  • 比较:比较当前值与前一个/后一个值
  • 分组:在不丢失明细的情况下将数据划分为多个存储桶

有关详细语法和示例,请参见上方各个函数的单独文档。

文档内容是否有帮助?