BigQuery:将 LAST_VALUE 与 ARRAY 结合使用

问题描述 投票:0回答:1

我希望使用 LAST_VALUE 来填充表中的缺失数据,但问题是,我需要填充的缺失数据由 ARRAY 字段组成。例如:

SELECT
  id_field,
  timestamp_field,
  LAST_VALUE(array_field) OVER(
    PARTITION BY id_field ORDER BY timestamp_field
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS array_field_carried
FROM table;

我可以在技术上做到这一点,但它不会携带 array_field 中的所有值。

有什么建议吗?

这是我从上面的代码得到的结果:

id_字段 时间戳字段 数组字段_携带
abc1 2023-12-01 10:00:00 世界标准时间
abc1 2023-12-01 11:00:00 世界标准时间
abc1 2023-12-01 12:00:00 世界标准时间 数组值1
数组值2
abc1 2023-12-01 13:00:00 世界标准时间
abc1 2023-12-01 14:00:00 世界标准时间
abc1 2023-12-01 15:00:00 世界标准时间
abc1 2023-12-01 16:00:00 世界标准时间

这是我期望的结果:

id_字段 时间戳字段 数组字段_携带
abc1 2023-12-01 10:00:00 世界标准时间
abc1 2023-12-01 11:00:00 世界标准时间
abc1 2023-12-01 12:00:00 世界标准时间 数组值1
数组值2
abc1 2023-12-01 13:00:00 世界标准时间 数组值1
数组值2
abc1 2023-12-01 14:00:00 世界标准时间 数组值1
数组值2
abc1 2023-12-01 15:00:00 世界标准时间 数组值1
数组值2
abc1 2023-12-01 16:00:00 世界标准时间 数组值1
数组值2
sql google-bigquery window-functions
1个回答
0
投票

前两行未填充,因为对于它们来说,所有

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
都持有
NULL
,因此
LAST_VALUE()
也会产生
NULL

您可以使用

COALESCE()
回退到默认值或前向查找。

SELECT
  id_field,
  timestamp_field,
  COALESCE( LAST_VALUE(array_field) 
              OVER (w1 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) )
           ,FIRST_VALUE(array_field IGNORE NULLS) 
              OVER (w1 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
           AS array_field_carried
FROM table
WINDOW w1 AS (PARTITION BY id_field ORDER BY timestamp_field);
© www.soinside.com 2019 - 2024. All rights reserved.