类别:

:doc:`/sql-reference/functions-window`(通用)

INTERPOLATE_BFILL、INTERPOLATE_FFILL、INTERPOLATE_LINEAR

更新时间序列数据集中的行,以根据周围值填充缺失值。

您可以调用以下插值窗口函数:

  • INTERPOLATE_BFILL:选择使用 时默认使用的角色和仓库。基于下一个观测到的行填充空缺行。

  • INTERPOLATE_FFILL:选择使用 时默认使用的角色和仓库。基于上一个观测到的行填充空缺行。

  • INTERPOLATE_LINEAR:选择使用 时默认使用的角色和仓库。基于前后值的线性插值填充空缺行。此函数仅支持数值。

这些函数具有相同的 窗口函数语法。它们不支持显式窗口框架。

语法

INTERPOLATE_BFILL( <expr> )
  OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] )
Copy
INTERPOLATE_FFILL( <expr> )
  OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] )
Copy
INTERPOLATE_LINEAR( <expr> )
  OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] )
Copy

实参

expr

定义要填充空缺的列的表达式。

INTERPOLATE_LINEAR 输入表达式必须是数字数据类型。

INTERPOLATE_BFILL 和 INTERPOLATE_FFILL 输入表达式不支持 地理空间数据类型

参数

OVER

标准窗口功能 OVER 子句。请参阅 窗口函数的语法和用法。对于插值函数,PARTITIONBY 子句是可选的,但 ORDER BY 子句是必需的。您不能指定显式窗口框架。

INTERPOLATE_LINEAR 函数只能有一个 ORDER BY 表达式,并且必须是数字、DATE、或 TIMESTAMP 表达式(包括所有 TIMESTAMP 变体)。

返回

这些函数返回的数据类型与输入表达式的数据类型相同。

示例

以下示例显示如何在简单查询中使用插值函数。

包含两个插值函数的示例

以下示例返回同一个查询中的重采样 temperature 值和两种不同的插值 temperature 值。(该表 march_temps_every_five_mins 是在本主题前面部分创建的。)

SELECT observed,
    temperature,
    INTERPOLATE_BFILL(temperature) OVER (PARTITION BY city, county ORDER BY observed) bfill_temp,
    INTERPOLATE_FFILL(temperature) OVER (PARTITION BY city, county ORDER BY observed) ffill_temp,
    city,
    county
  FROM march_temps_every_five_mins
  ORDER BY observed;
Copy
+-------------------------+-------------+------------+------------+------------------+----------------+
| OBSERVED                | TEMPERATURE | BFILL_TEMP | FFILL_TEMP | CITY             | COUNTY         |
|-------------------------+-------------+------------+------------+------------------+----------------|
| 2025-03-15 09:45:00.000 |        NULL |         48 |       NULL | Big Bear City    | San Bernardino |
| 2025-03-15 09:49:00.000 |          48 |         48 |         48 | Big Bear City    | San Bernardino |
| 2025-03-15 09:50:00.000 |        NULL |         49 |         48 | Big Bear City    | San Bernardino |
| 2025-03-15 09:50:00.000 |          44 |         44 |         44 | South Lake Tahoe | El Dorado      |
| 2025-03-15 09:55:00.000 |          49 |         49 |         49 | Big Bear City    | San Bernardino |
| 2025-03-15 09:55:00.000 |          46 |         46 |         46 | South Lake Tahoe | El Dorado      |
| 2025-03-15 10:00:00.000 |        NULL |         51 |         49 | Big Bear City    | San Bernardino |
| 2025-03-15 10:00:00.000 |        NULL |         52 |         46 | South Lake Tahoe | El Dorado      |
| 2025-03-15 10:05:00.000 |        NULL |         51 |         49 | Big Bear City    | San Bernardino |
| 2025-03-15 10:05:00.000 |        NULL |         52 |         46 | South Lake Tahoe | El Dorado      |
| 2025-03-15 10:10:00.000 |          51 |         51 |         51 | Big Bear City    | San Bernardino |
| 2025-03-15 10:10:00.000 |          52 |         52 |         52 | South Lake Tahoe | El Dorado      |
| 2025-03-15 10:15:00.000 |        NULL |         54 |         51 | Big Bear City    | San Bernardino |
| 2025-03-15 10:15:00.000 |          54 |         54 |         54 | South Lake Tahoe | El Dorado      |
| 2025-03-15 10:18:00.000 |          54 |         54 |         54 | Big Bear City    | San Bernardino |
+-------------------------+-------------+------------+------------+------------------+----------------+

bfill_temp 列为每行返回一个有意义的值,但 ffill_temp 针对第一行返回 NULL。INTERPOLATE_FFILL 函数需要先前的值才能返回非 NULL 结果。INTERPOLATE_BFILL 函数只需要下一个值。

显式窗口框架的预期错误示例

以下查询返回错误,因为插值函数不支持显式窗口框架:

SELECT observed, temperature,
    INTERPOLATE_BFILL(temperature)
      OVER (PARTITION BY city, county ORDER BY observed ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) bfill_temp,
    city, county
  FROM march_temps_every_five_mins
  ORDER BY observed;
Copy
002303 (0A000): SQL compilation error: error line 1 at position 111
Sliding window frame unsupported for function INTERPOLATE_BFILL
语言: 中文