窗口函数允许您在不折叠行进行分组的情况下计算累计总和、移动平均值或其他类似聚合的结果。它们在一组“窗口”行上执行计算,您可以以各种方式对这些行进行分区和排序,并为集合中的每一行返回计算值。
与将每个组合并为单行的非窗口 聚合函数 不同,窗口函数会保留每行的身份,并为分区中的每一行计算一个附加值。
例如,以下查询使用 家庭传感器示例数据,并返回每个温度读数以及查询时间范围内每个房间的平均温度。
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
| time | room | temp | avg_room_temp |
|---|
| 2022-01-01T08:00:00 | 厨房 | 21.0 | 22.0 |
| 2022-01-01T09:00:00 | 厨房 | 23.0 | 22.0 |
| 2022-01-01T08:00:00 | 客厅 | 21.1 | 21.25 |
| 2022-01-01T09:00:00 | 客厅 | 21.4 | 21.25 |
窗口帧
由于窗口函数在行上操作,因此存在属于该行的分区中的一组行,窗口函数使用该行来执行操作。这组行称为窗口帧。可以使用 RANGE、ROW 或 GROUPS 帧单位定义窗口帧边界,每个单位相对于当前行——例如:
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 帧单位,您必须按数值类型列对分区进行排序。
... OVER (
ORDER BY wind_direction
RANGE BETWEEN 45 PRECEDING AND 45 FOLLOWING
)
窗口帧包含排序列值在当前行值下方 45 到上方 45 之间的行。
| time | city | wind_direction |
|---|
| 2025-02-17T13:00:00 | Rome | 33 |
| 2025-02-17T08:00:00 | Rome | 34 |
| 2025-02-17T23:00:00 | Rome | 49 |
| 2025-02-17T17:00:00 | Rome | 86 |
| 2025-02-17T11:00:00 | Rome | 93 |
| 2025-02-17T12:00:00 | Rome | 115 |
| 2025-02-17T10:00:00 | Rome | 156 |
查看 RANGE 帧单位如何与间隔偏移量一起使用
要使用间隔偏移量与 RANGE 帧单位,您必须按 time 或时间戳类型列对分区进行排序。
... OVER (
ORDER BY time
RANGE BETWEEN
INTERVAL '3 hours' PRECEDING
AND INTERVAL '1 hour' FOLLOWING
)
窗口帧包含当前行时间戳之前三个小时到之后一个小时之间的行。
| time | room | temp |
|---|
| 2022-01-01T08:00:00 | 厨房 | 21.0 |
| 2022-01-01T09:00:00 | 厨房 | 23.0 |
| 2022-01-01T10:00:00 | 厨房 | 22.7 |
| 2022-01-01T11:00:00 | 厨房 | 22.4 |
| 2022-01-01T12:00:00 | 厨房 | 22.5 |
| 2022-01-01T13:00:00 | 厨房 | 22.8 |
| 2022-01-01T14:00:00 | 厨房 | 22.8 |
| 2022-01-01T15:00:00 | 厨房 | 22.7 |
ROWS
使用相对于当前行的行位置来定义窗口帧边界。偏移量是当前行与行位置的差值。ROWS 支持以下偏移量类型:
查看 ROWS 帧单位如何工作
使用 ROWS 帧单位时,相对于当前行的行位置决定帧边界——例如:
... OVER (
ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING
)
窗口帧包含当前行之前的两行和之后一行。
| time | city | wind_direction |
|---|
| 2025-02-17T08:00:00 | Rome | 34 |
| 2025-02-17T10:00:00 | Rome | 156 |
| 2025-02-17T11:00:00 | Rome | 93 |
| 2025-02-17T12:00:00 | Rome | 115 |
| 2025-02-17T13:00:00 | Rome | 33 |
| 2025-02-17T17:00:00 | Rome | 86 |
| 2025-02-17T23:00:00 | Rome | 49 |
GROUPS
使用行组定义窗口帧边界。具有 ORDER BY 子句中列的相同值的行组成一个行组。
使用 GROUPS 帧单位时,请包含 ORDER BY 子句。
偏移量是相对于当前行组的行组位置的差值。GROUPS 支持以下偏移量类型:
查看 GROUPS 帧单位如何工作
使用 GROUPS 帧单位时,ORDER BY 子句中列值的唯一组合确定每个行组。例如,如果您按 country 和 city 排序
... OVER (
ORDER BY country, city
GROUPS ...
)
查询以如下方式定义行组:
| time | country | city | wind_direction |
|---|
| 2025-02-17T00:00:00 | France | Strasbourg | 181 |
| 2025-02-17T01:00:00 | France | Strasbourg | 228 |
| 2025-02-17T02:00:00 | France | Strasbourg | 289 |
| 2025-02-17T00:00:00 | France | Toulouse | 24 |
| 2025-02-17T01:00:00 | France | Toulouse | 210 |
| 2025-02-17T02:00:00 | France | Toulouse | 206 |
| 2025-02-17T00:00:00 | Italy | Bari | 2 |
| 2025-02-17T01:00:00 | Italy | Bari | 57 |
| 2025-02-17T00:00:00 | Italy | Bologna | 351 |
| 2025-02-17T01:00:00 | Italy | Bologna | 232 |
| 2025-02-17T02:00:00 | Italy | Bologna | 29 |
然后,您可以使用组偏移量来确定帧边界。
... OVER (
ORDER BY country, city
GROUPS 2 PRECEDING
)
窗口函数使用当前行组和前面两个行组中的所有行来执行操作。
| time | country | city | wind_direction |
|---|
| 2025-02-17T00:00:00 | France | Strasbourg | 181 |
| 2025-02-17T01:00:00 | France | Strasbourg | 228 |
| 2025-02-17T02:00:00 | France | Strasbourg | 289 |
| 2025-02-17T00:00:00 | France | Toulouse | 24 |
| 2025-02-17T01:00:00 | France | Toulouse | 210 |
| 2025-02-17T02:00:00 | France | Toulouse | 206 |
| 2025-02-17T00:00:00 | Italy | Bari | 2 |
| 2025-02-17T01:00:00 | Italy | Bari | 57 |
| 2025-02-17T00:00:00 | Italy | Bologna | 351 |
| 2025-02-17T01:00:00 | Italy | Bologna | 232 |
| 2025-02-17T02:00:00 | Italy | Bologna | 29 |
帧边界
帧边界(frame_start 和 frame_end)定义窗口函数操作的每个帧的边界。
UNBOUNDED PRECEDING
从分区的第一个行开始,到当前行结束。
offset PRECEDING
从当前行之前的 offset 帧单位开始,到当前行结束。例如,3 PRECEDING 包括当前行之前的 3 行。
CURRENT ROW
当用作边界时,开始和结束都在当前行。
offset FOLLOWING
从当前行开始,到当前行之后的 offset 帧单位结束。例如,3 FOLLOWING 包括当前行之后的 3 行。
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 查询示例
以下示例使用 家庭传感器示例数据。
SELECT
time,
room,
temp,
cume_dist() OVER (
PARTITION BY room
ORDER BY temp
) AS cume_dist
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T12:00:00Z'
| time | room | temp | cume_dist |
|---|
| 2022-01-01T08:00:00 | 客厅 | 21.1 | 0.25 |
| 2022-01-01T09:00:00 | 客厅 | 21.4 | 0.5 |
| 2022-01-01T10:00:00 | 客厅 | 21.8 | 0.75 |
| 2022-01-01T11:00:00 | 客厅 | 22.2 | 1.0 |
| 2022-01-01T08:00:00 | 厨房 | 21.0 | 0.25 |
| 2022-01-01T11:00:00 | 厨房 | 22.4 | 0.5 |
| 2022-01-01T10:00:00 | 厨房 | 22.7 | 0.75 |
| 2022-01-01T09:00:00 | 厨房 | 23.0 | 1.0 |
dense_rank
返回当前行在其分区中的排名。排名是连续的;它为重复值分配相同的排名号,并且排名序列会随着下一个不同值继续(与 rank() 不同)。
OVER 子句中的 ORDER BY 子句决定排名顺序。
查看 dense_rank 查询示例
以下示例使用 家庭传感器示例数据。
SELECT
time,
room,
temp,
dense_rank() OVER (
PARTITION BY room
ORDER BY temp
) AS dense_rank
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T12:00:00Z'
| time | room | temp | dense_rank |
|---|
| 2022-01-01T08:00:00 | 厨房 | 21.0 | 1 |
| 2022-01-01T11:00:00 | 厨房 | 22.4 | 2 |
| 2022-01-01T10:00:00 | 厨房 | 22.7 | 3 |
| 2022-01-01T09:00:00 | 厨房 | 23.0 | 4 |
| 2022-01-01T08:00:00 | 客厅 | 21.1 | 1 |
| 2022-01-01T09:00:00 | 客厅 | 21.4 | 2 |
| 2022-01-01T10:00:00 | 客厅 | 21.8 | 3 |
| 2022-01-01T11:00:00 | 客厅 | 22.2 | 4 |
比较 dense_rank、rank 和 row_number 函数
考虑一个具有重复 ID 值的表。以下查询显示了每个排名函数如何处理重复值:
SELECT
id,
rank() OVER(ORDER BY id),
dense_rank() OVER(ORDER BY id),
row_number() OVER(ORDER BY id)
FROM my_table;
| ID | rank | dense_rank | row_number |
|---|
| 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 2 |
| 1 | 1 | 1 | 3 |
| 2 | 4 | 2 | 4 |
主要区别
ntile
将有序分区中的行分配到指定数量的组中。每个组从一开始编号。对于每一行,ntile 返回该行所属的组号。组号范围从 1 到 expression 的值,尽可能平均地分割分区。OVER 子句中的 ORDER BY 子句决定排名顺序。
参数
- expression:一个整数。要将分区分成多少组。
查看 ntile 查询示例
以下示例使用 家庭传感器示例数据。
SELECT
time,
temp,
ntile(4) OVER (
ORDER BY time
) AS ntile
FROM home
WHERE
room = 'Kitchen'
AND time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T15:00:00Z'
| time | temp | ntile |
|---|
| 2022-01-01T08:00:00 | 21.0 | 1 |
| 2022-01-01T09:00:00 | 23.0 | 1 |
| 2022-01-01T10:00:00 | 22.7 | 2 |
| 2022-01-01T11:00:00 | 22.4 | 2 |
| 2022-01-01T12:00:00 | 22.5 | 3 |
| 2022-01-01T13:00:00 | 22.8 | 3 |
| 2022-01-01T14:00:00 | 22.8 | 4 |
percent_rank
返回当前行在其分区中的百分比排名。返回值介于 0 和 1 之间,计算如下:
(rank - 1) / (total_rows - 1)
OVER 子句中的 ORDER BY 子句决定排名顺序。
查看 percent_rank 查询示例
以下示例使用 家庭传感器示例数据。
SELECT
time,
room,
temp,
percent_rank() OVER (
PARTITION BY room
ORDER BY temp
) AS percent_rank
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T11:00:00Z'
| time | room | temp | percent_rank |
|---|
| 2022-01-01T08:00:00 | 厨房 | 21.0 | 0.0 |
| 2022-01-01T10:00:00 | 厨房 | 22.7 | 0.5 |
| 2022-01-01T09:00:00 | 厨房 | 23.0 | 1.0 |
| 2022-01-01T08:00:00 | 客厅 | 21.1 | 0.0 |
| 2022-01-01T09:00:00 | 客厅 | 21.4 | 0.5 |
| 2022-01-01T10:00:00 | 客厅 | 21.8 | 1.0 |
rank
返回当前行在其分区中的排名。对于重复值,rank 为它们分配相同的排名号,跳过后续排名(与 dense_rank() 不同),然后继续用下一个不同值进行排名。
OVER 子句中的 ORDER BY 子句决定排名顺序。
查看 rank 查询示例
以下示例使用 家庭传感器示例数据。
SELECT
time,
room,
temp,
rank() OVER (
PARTITION BY room
ORDER BY temp
) AS rank
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T11:00:00Z'
| time | room | temp | rank |
|---|
| 2022-01-01T08:00:00 | 客厅 | 21.1 | 1 |
| 2022-01-01T09:00:00 | 客厅 | 21.4 | 2 |
| 2022-01-01T10:00:00 | 客厅 | 21.8 | 3 |
| 2022-01-01T08:00:00 | 厨房 | 21.0 | 1 |
| 2022-01-01T10:00:00 | 厨房 | 22.7 | 2 |
| 2022-01-01T09:00:00 | 厨房 | 23.0 | 3 |
比较 dense_rank、rank 和 row_number 函数
考虑一个具有重复 ID 值的表。以下查询显示了每个排名函数如何处理重复值:
SELECT
id,
rank() OVER(ORDER BY id),
dense_rank() OVER(ORDER BY id),
row_number() OVER(ORDER BY id)
FROM my_table;
| ID | rank | dense_rank | row_number |
|---|
| 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 2 |
| 1 | 1 | 1 | 3 |
| 2 | 4 | 2 | 4 |
主要区别
row_number
返回当前行在其分区中的位置,从 1 开始计数。OVER 子句中的 ORDER BY 子句决定行顺序。
查看 row_number 查询示例
以下示例使用 家庭传感器示例数据。
SELECT
time,
room,
temp,
row_number() OVER (
PARTITION BY room
ORDER BY temp
) AS row_number
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T11:00:00Z'
| time | room | temp | row_number |
|---|
| 2022-01-01T08:00:00 | 客厅 | 21.1 | 1 |
| 2022-01-01T09:00:00 | 客厅 | 21.4 | 2 |
| 2022-01-01T10:00:00 | 客厅 | 21.8 | 3 |
| 2022-01-01T08:00:00 | 厨房 | 21.0 | 1 |
| 2022-01-01T10:00:00 | 厨房 | 22.7 | 2 |
| 2022-01-01T09:00:00 | 厨房 | 23.0 | 3 |
比较 dense_rank、rank 和 row_number 函数
考虑一个具有重复 ID 值的表。以下查询显示了每个排名函数如何处理重复值:
SELECT
id,
rank() OVER(ORDER BY id),
dense_rank() OVER(ORDER BY id),
row_number() OVER(ORDER BY id)
FROM my_table;
| ID | rank | dense_rank | row_number |
|---|
| 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 2 |
| 1 | 1 | 1 | 3 |
| 2 | 4 | 2 | 4 |
主要区别
分析函数
first_value
返回窗口帧第一行的值。
参数
- expression:要操作的表达式。可以是常量、列或函数,以及任意算术运算符的组合。
last_value
查看 first_value 查询示例
以下示例使用 家庭传感器示例数据。
SELECT
time,
room,
temp,
first_value(temp) OVER (
PARTITION BY room
ORDER BY time
) AS first_value
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T11:00:00Z'
ORDER BY room, time
| time | room | temp | first_value |
|---|
| 2022-01-01T08:00:00 | 厨房 | 21.0 | 21.0 |
| 2022-01-01T09:00:00 | 厨房 | 23.0 | 21.0 |
| 2022-01-01T10:00:00 | 厨房 | 22.7 | 21.0 |
| 2022-01-01T08:00:00 | 客厅 | 21.1 | 21.1 |
| 2022-01-01T09:00:00 | 客厅 | 21.4 | 21.1 |
| 2022-01-01T10:00:00 | 客厅 | 21.8 | 21.1 |
lag
返回分区中当前行之前的指定偏移量行的值。如果偏移量行超出了分区,则函数返回指定的默认值。
lag(expression, offset, default)
参数
- expression:要操作的表达式。可以是常量、列或函数,以及算术或字符串运算符的任意组合。
- offset:要从表达式中检索值的当前行之前的行数。默认为
1。 - default:如果偏移量超出了分区,则返回的默认值。必须与expression具有相同类型。
lead
查看 lag 查询示例
以下示例使用 家庭传感器示例数据。
SELECT
time,
room,
temp,
lag(temp, 1, 0) OVER (
PARTITION BY room
ORDER BY time
) AS previous_value
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T11:00:00Z'
ORDER BY room, time
| time | room | temp | previous_value |
|---|
| 2022-01-01T08:00:00 | 厨房 | 21.0 | 0.0 |
| 2022-01-01T09:00:00 | 厨房 | 23.0 | 21.0 |
| 2022-01-01T10:00:00 | 厨房 | 22.7 | 23.0 |
| 2022-01-01T08:00:00 | 客厅 | 21.1 | 0.0 |
| 2022-01-01T09:00:00 | 客厅 | 21.4 | 21.1 |
| 2022-01-01T10:00:00 | 客厅 | 21.8 | 21.4 |
计算与前一个值的差值
使用 LAG 结合算术运算来计算当前值与前一个值之间的差值。这对于检测随时间的变化很有用。
以下查询计算与上一次读数相比的温度变化:
SELECT
time,
room,
temp,
temp - lag(temp, 1) OVER (
PARTITION BY room
ORDER BY time
) AS temp_change
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T11:00:00Z'
ORDER BY room, time
| time | room | temp | temp_change |
|---|
| 2022-01-01T08:00:00 | 厨房 | 21.0 | NULL |
| 2022-01-01T09:00:00 | 厨房 | 23.0 | 2.0 |
| 2022-01-01T10:00:00 | 厨房 | 22.7 | -0.3 |
| 2022-01-01T08:00:00 | 客厅 | 21.1 | NULL |
| 2022-01-01T09:00:00 | 客厅 | 21.4 | 0.3 |
| 2022-01-01T10:00:00 | 客厅 | 21.8 | 0.4 |
计算与特定时间偏移量值的差值
对于规律间隔的数据,使用带有偏移量的 LAG 来比较来自特定时间段之前的值。
以下查询比较相隔 1 小时的温度值(假设为每小时数据):
SELECT
time,
room,
temp,
lag(temp, 1) OVER (
PARTITION BY room
ORDER BY time
) AS temp_1h_ago,
temp - lag(temp, 1) OVER (
PARTITION BY room
ORDER BY time
) AS hourly_change
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T12:00:00Z'
ORDER BY room, time
对不规律间隔的数据使用自连接
对于不规律间隔的时间序列数据,当您需要比较精确时间偏移量(例如,正好一小时前)的值时,请使用带有间隔算术的自连接。
SELECT
current.time,
current.room,
current.temp AS current_temp,
previous.temp AS temp_1h_ago,
current.temp - previous.temp AS hourly_diff
FROM home AS current
LEFT JOIN home AS previous
ON current.room = previous.room
AND previous.time = current.time - INTERVAL '1 hour'
WHERE
current.time >= '2022-01-01T08:00:00Z'
AND current.time < '2022-01-01T12:00:00Z'
ORDER BY current.room, current.time
当数据点不落在规律的时间间隔上,或者您需要与特定时间偏移量进行比较而不管上一个数据点何时发生时,此方法有效。
last_value
返回窗口帧最后一行的值。
参数
- expression:要操作的表达式。可以是常量、列或函数,以及任意算术运算符的组合。
first_value
查看 last_value 查询示例
以下示例使用 家庭传感器示例数据。
SELECT
time,
room,
temp,
last_value(temp) OVER (
PARTITION BY room
ORDER BY time
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) AS last_value
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T11:00:00Z'
ORDER BY room, time
| time | room | temp | last_value |
|---|
| 2022-01-01T08:00:00 | 厨房 | 21.0 | 22.7 |
| 2022-01-01T09:00:00 | 厨房 | 23.0 | 22.7 |
| 2022-01-01T10:00:00 | 厨房 | 22.7 | 22.7 |
| 2022-01-01T08:00:00 | 客厅 | 21.1 | 21.8 |
| 2022-01-01T09:00:00 | 客厅 | 21.4 | 21.8 |
| 2022-01-01T10:00:00 | 客厅 | 21.8 | 21.8 |
lead
返回分区中当前行之后的指定偏移量行的值。如果偏移量行超出了分区,则函数返回指定的默认值。
lead(expression, offset, default)
参数
- expression:要操作的表达式。可以是常量、列或函数,以及算术或字符串运算符的任意组合。
- offset:要从表达式中检索值的当前行之前的行数。默认为
1。 - default:如果偏移量超出了分区,则返回的默认值。必须与expression具有相同类型。
lag
查看 lead 查询示例
以下示例使用 家庭传感器示例数据。
SELECT
time,
room,
temp,
lead(temp, 1, 0) OVER (
PARTITION BY room
ORDER BY time
) AS next_value
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time < '2022-01-01T11:00:00Z'
ORDER BY room, time
| time | room | temp | next_value |
|---|
| 2022-01-01T08:00:00 | 厨房 | 21.0 | 23.0 |
| 2022-01-01T09:00:00 | 厨房 | 23.0 | 22.7 |
| 2022-01-01T10:00:00 | 厨房 | 22.7 | 0.0 |
| 2022-01-01T08:00:00 | 客厅 | 21.1 | 21.4 |
| 2022-01-01T09:00:00 | 客厅 | 21.4 | 21.8 |
| 2022-01-01T10:00:00 | 客厅 | 21.8 | 0.0 |
nth_value
返回窗口帧中第 n 行(从 1 开始计数)的值。如果第 n 行不存在,则函数返回null。
参数
- expression:要操作的表达式。可以是常量、列或函数,以及算术或字符串运算符的任意组合。
- n:指定当前帧和分区中要引用的行号。
查看 lead 查询示例
以下示例使用 家庭传感器示例数据。
SELECT
time,
room,
temp,
nth_value(temp, 2) OVER (
PARTITION BY room
) AS second_temp
FROM home
WHERE
time >= '2025-02-10T08:00:00Z'
AND time < '2025-02-10T11:00:00Z'
| time | room | temp | second_temp |
|---|
| 2025-02-10T08:00:00 | 厨房 | 21.0 | 22.7 |
| 2025-02-10T10:00:00 | 厨房 | 22.7 | 22.7 |
| 2025-02-10T09:00:00 | 厨房 | 23.0 | 22.7 |
| 2025-02-10T08:00:00 | 客厅 | 21.1 | 21.8 |
| 2025-02-10T10:00:00 | 客厅 | 21.8 | 21.8 |
| 2025-02-10T09:00:00 | 客厅 | 21.4 | 21.8 |
支持和反馈
感谢您成为我们社区的一员!我们欢迎并鼓励您对 InfluxDB 3 Core 和本文档提供反馈和错误报告。要获得支持,请使用以下资源
具有年度合同或支持合同的客户可以 联系 InfluxData 支持。