跳转到主要内容
窗口函数可让你对与当前行相关的一组行进行计算。 它们可用于执行与聚合函数类似的计算,但不同之处在于,窗口函数不会将多行分组成单个输出,而是仍会返回各个行。

标准窗口函数

ClickHouse 支持窗口和窗口函数的标准 SQL 语法。 下表展示了当前支持的功能:

语法

  • PARTITION BY - 定义如何将结果集划分为多个组。
  • ORDER BY - 定义在计算 aggregate_function 时,如何对组内的行进行排序。
  • ROWS or RANGE - 定义窗口帧的边界,aggregate_function 在窗口帧内进行计算。
  • WINDOW - 允许多个表达式使用同一个窗口定义。

仅可作为窗口函数使用的函数

以下函数只能作为窗口函数使用。其中大多数是标准 SQL 函数;lagInFrameleadInFramenonNegativeDerivative 是 ClickHouse 扩展。

示例

下面来看一些窗口函数的使用示例。

为行编号

聚合函数

将每位球员的薪资与其所在球队的平均薪资进行比较。
比较每位球员的薪资与其所在球队的最高薪资。

按列分区

窗口帧界定

真实场景示例

以下示例用于解决常见的实际问题。

各部门的最高/总工资

累积和

移动平均 / 滑动平均 (每 3 行)

移动平均 / 滑动平均 (每 10 秒)

移动平均 / 滑动平均 (每 10 天)

温度以秒级精度存储,但使用 RangeORDER BY toDate(ts) 时,我们构造出的窗口帧大小为 10 个单位;而由于使用了 toDate(ts),这里的单位是天。

参考资料

GitHub Issues

有关窗口函数初步支持的路线图,请参见此 issue 所有与窗口函数相关的 GitHub issue 都带有 comp-window-functions 标签。

测试

这些测试包含当前已支持语法的示例: https://github.com/ClickHouse/ClickHouse/blob/master/tests/performance/window_functions.xml https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/01591_window_functions.sql

Postgres 文档

https://www.postgresql.org/docs/current/sql-select.html#SQL-WINDOW https://www.postgresql.org/docs/devel/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS https://www.postgresql.org/docs/devel/functions-window.html https://www.postgresql.org/docs/devel/tutorial-window.html

MySQL 文档

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html
最后修改于 2026年6月25日