我希望使用 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 |
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);