文档文档

SQL 窗口函数

窗口函数允许您在不折叠行进行分组的情况下计算累计总和、移动平均值或其他类似聚合的结果。它们在一组“窗口”行上执行计算,您可以以各种方式对这些行进行分区和排序,并为集合中的每一行返回计算值。

与将每个组合并为单行的非窗口 聚合函数 不同,窗口函数会保留每行的身份,并为分区中的每一行计算一个附加值。

例如,以下查询使用 家庭传感器示例数据,并返回每个温度读数以及查询时间范围内每个房间的平均温度。

SELECT
  time,
  room,
  temp,
  avg(temp) OVER (PARTITION BY room) AS avg_room_temp
FROM
  home
WHERE
  time >= '2022-01-01T08:00:00Z'
  AND time <= '2022-01-01T09:00:00Z'
ORDER BY
  room,
  time
timeroomtempavg_room_temp
2022-01-01T08:00:00厨房21.022.0
2022-01-01T09:00:00厨房23.022.0
2022-01-01T08:00:00客厅21.121.25
2022-01-01T09:00:00客厅21.421.25

窗口帧

由于窗口函数在行上操作,因此存在属于该行的分区中的一组行,窗口函数使用该行来执行操作。这组行称为窗口帧。可以使用 RANGEROWGROUPS 帧单位定义窗口帧边界,每个单位相对于当前行——例如:

SELECT
  time,
  temp,
  avg(temp) OVER (
    ORDER BY time
    RANGE INTERVAL '3 hours' PRECEDING
  ) AS 3h_moving_avg
FROM home
WHERE room = 'Kitchen'
SELECT
  time,
  temp,
  avg(temp) OVER (
    ROWS 3 PRECEDING
  ) AS moving_avg
FROM home
WHERE room = 'Kitchen'
SELECT
  time,
  room,
  temp,
  avg(temp) OVER (
    ORDER BY room
    GROUPS 1 PRECEDING
  ) AS moving_avg
FROM home

有关窗口帧工作原理的更多信息,请参阅 帧子句

如果您不指定窗口帧,窗口函数将使用当前分区中的所有行来执行其操作。

function([expr])
  OVER(
    [PARTITION BY expr[, ]]
    [ORDER BY expr [ ASC | DESC ][, ]]
    [ frame_clause ]
    )

OVER 子句

窗口函数使用紧跟在窗口函数
名称和参数之后的 OVER 子句。
名称和参数。
OVER 子句在语法上将窗口
函数与非窗口或聚合函数区分开来,并定义如何为窗口操作对行进行分组和排序。
函数与非窗口或聚合函数区分开来,并定义如何为窗口操作对行进行分组和排序。

PARTITION BY 子句

OVER 子句中的 PARTITION BY 子句将行划分为组或分区,这些行共享 PARTITION BY 表达式的相同值。窗口函数作用于与当前行属于同一分区的所有行。

ORDER BY 子句

OVER 子句中的 ORDER BY 子句控制窗口函数在每个分区中处理行的顺序。当窗口子句包含 ORDER BY 子句时,窗口帧边界可以是显式的或隐式的,它会限制窗口帧的大小,相对于当前行在两个方向上。

OVER 子句中的 ORDER BY 子句确定每个分区中行的处理顺序,并且独立于查询的 ORDER BY 子句。

帧子句

帧子句定义窗口帧边界,可以是以下之一:

{ RANGE | ROWS | GROUPS } frame_start
{ RANGE | ROWS | GROUPS } BETWEEN frame_start AND frame_end

帧单位

定义窗口帧时,可以使用以下帧单位之一:

RANGE

使用具有在 ORDER BY 子句中指定的列值的行来定义帧边界,该值相对于当前行值在值范围内。

使用 RANGE 帧单位时,必须包含一个包含正好一列ORDER BY 子句。

偏移量是当前行值与周围行值之间的差值。RANGE 支持以下偏移量类型:

  • 数值(非负)
  • 数字字符串(非负)
  • 间隔

查看 RANGE 帧单位如何与数值偏移量一起使用

查看 RANGE 帧单位如何与间隔偏移量一起使用

ROWS

使用相对于当前行的行位置来定义窗口帧边界。偏移量是当前行与行位置的差值。ROWS 支持以下偏移量类型:

  • 数值(非负)
  • 数字字符串(非负)

查看 ROWS 帧单位如何工作

GROUPS

使用行组定义窗口帧边界。具有 ORDER BY 子句中列的相同值的行组成一个行组。

使用 GROUPS 帧单位时,请包含 ORDER BY 子句。

偏移量是相对于当前行组的行组位置的差值。GROUPS 支持以下偏移量类型:

  • 数值(非负)
  • 数字字符串(非负)

查看 GROUPS 帧单位如何工作

帧边界

帧边界(frame_startframe_end)定义窗口函数操作的每个帧的边界。

UNBOUNDED PRECEDING

从分区的第一个行开始,到当前行结束。

UNBOUNDED PRECEDING
offset PRECEDING

从当前行之前的 offset 帧单位开始,到当前行结束。例如,3 PRECEDING 包括当前行之前的 3 行。

<offset> PRECEDING
CURRENT ROW

当用作边界时,开始和结束都在当前行。

CURRENT ROW
offset FOLLOWING

从当前行开始,到当前行之后的 offset 帧单位结束。例如,3 FOLLOWING 包括当前行之后的 3 行。

<offset> FOLLOWING
UNBOUNDED FOLLOWING

使用当前行到当前分区的末尾作为帧边界。

UNBOUNDED FOLLOWING

WINDOW 子句

使用 WINDOW 子句为窗口规范定义可重用的别名。当查询中的多个窗口函数共享相同的窗口定义时,这很有用。

与其为每个函数重复相同的 OVER 子句,不如定义一次窗口并按别名引用它——例如:

SELECT
  sum(net_gain) OVER w,
  avg(net_net) OVER w
FROM
  finance
WINDOW w AS ( PARTITION BY ticker ORDER BY time DESC);

聚合函数

所有 聚合函数都可以用作窗口函数。

排名函数

cume_dist

返回一组值中值的累积分布。返回值大于 0 且小于或等于 1,表示值在集合中的相对排名。OVER 子句中的 ORDER BY 子句用于正确计算当前行值的累积分布。

cume_dist()

使用 cume_dist 时,请在 OVER 子句中包含 ORDER BY 子句

查看 cume_dist 查询示例

dense_rank

返回当前行在其分区中的排名。排名是连续的;它为重复值分配相同的排名号,并且排名序列会随着下一个不同值继续(与 rank() 不同)。

OVER 子句中的 ORDER BY 子句决定排名顺序。

dense_rank()

查看 dense_rank 查询示例

比较 dense_rankrankrow_number 函数

ntile

将有序分区中的行分配到指定数量的组中。每个组从一开始编号。对于每一行,ntile 返回该行所属的组号。组号范围从 1 到 expression 的值,尽可能平均地分割分区。OVER 子句中的 ORDER BY 子句决定排名顺序。

ntile(expression)

参数

  • expression:一个整数。要将分区分成多少组。

查看 ntile 查询示例

percent_rank

返回当前行在其分区中的百分比排名。返回值介于 01 之间,计算如下:

(rank - 1) / (total_rows - 1)

OVER 子句中的 ORDER BY 子句决定排名顺序。

percent_rank()

查看 percent_rank 查询示例

rank

返回当前行在其分区中的排名。对于重复值,rank 为它们分配相同的排名号,跳过后续排名(与 dense_rank() 不同),然后继续用下一个不同值进行排名。

OVER 子句中的 ORDER BY 子句决定排名顺序。

rank()

查看 rank 查询示例

比较 dense_rankrankrow_number 函数

row_number

返回当前行在其分区中的位置,从 1 开始计数。OVER 子句中的 ORDER BY 子句决定行顺序。

row_number()

查看 row_number 查询示例

比较 dense_rankrankrow_number 函数

分析函数

first_value

返回窗口帧第一行的值。

first_value(expression)

参数

  • expression:要操作的表达式。可以是常量、列或函数,以及任意算术运算符的组合。

last_value

查看 first_value 查询示例

lag

返回分区中当前行之前的指定偏移量行的值。如果偏移量行超出了分区,则函数返回指定的默认值。

lag(expression, offset, default)

参数

  • expression:要操作的表达式。可以是常量、列或函数,以及算术或字符串运算符的任意组合。
  • offset:要从表达式中检索值的当前行之前的行数。默认为 1
  • default:如果偏移量超出了分区,则返回的默认值。必须与expression具有相同类型。

lead

查看 lag 查询示例

计算与前一个值的差值

计算与特定时间偏移量值的差值

对不规律间隔的数据使用自连接

last_value

返回窗口帧最后一行的值。

last_value(expression)

参数

  • expression:要操作的表达式。可以是常量、列或函数,以及任意算术运算符的组合。

first_value

查看 last_value 查询示例

lead

返回分区中当前行之后的指定偏移量行的值。如果偏移量行超出了分区,则函数返回指定的默认值。

lead(expression, offset, default)

参数

  • expression:要操作的表达式。可以是常量、列或函数,以及算术或字符串运算符的任意组合。
  • offset:要从表达式中检索值的当前行之前的行数。默认为 1
  • default:如果偏移量超出了分区,则返回的默认值。必须与expression具有相同类型。

lag

查看 lead 查询示例

nth_value

返回窗口帧中第 n 行(从 1 开始计数)的值。如果第 n 行不存在,则函数返回null

nth_value(expression, n)

参数

  • expression:要操作的表达式。可以是常量、列或函数,以及算术或字符串运算符的任意组合。
  • n:指定当前帧和分区中要引用的行号。

查看 lead 查询示例


此页面是否有帮助?

感谢您的反馈!


InfluxDB 3.8 新特性

InfluxDB 3.8 和 InfluxDB 3 Explorer 1.6 的主要增强功能。

查看博客文章

InfluxDB 3.8 现已适用于 Core 和 Enterprise 版本,同时发布了 InfluxDB 3 Explorer UI 的 1.6 版本。本次发布着重于操作成熟度,以及如何更轻松地部署、管理和可靠地运行 InfluxDB。

更多信息,请查看

InfluxDB Docker 的 latest 标签将指向 InfluxDB 3 Core

在 **2026 年 2 月 3 日**,InfluxDB Docker 镜像的 latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。

如果使用 Docker 来安装和运行 InfluxDB,latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。例如,如果使用 Docker 运行 InfluxDB v2,请将 latest 版本标签替换为 Docker pull 命令中的特定版本标签 — 例如

docker pull influxdb:2