Snowflake 中的递归更新

Recursive update in Snowflake

我在 snowflake 中有一个针对不同用户的 table。如果有 'Z' 值,我需要更新值列。 Z 将替换为该用户最接近的非 Z 值。

原文Table:

| User | Order | Value |
| ---- | ------| ----- |
| A    | 1     |  X    |
| A    | 2     |  Y    |
| A    | 3     |  Z    |
| A    | 4     |  Z    |
| A    | 5     |  W    |
| A    | 6     |  Z    |
| B    | 1     |  Y    |
| B    | 2     |  Z    |
| B    | 3     |  Z    |

目标 Table:

| User | Order | Value |
| ---- | ------| ----- |
| A    | 1     |  X    |
| A    | 2     |  Y    |
| A    | 3     |  Y    |
| A    | 4     |  Y    |
| A    | 5     |  W    |
| A    | 6     |  W    |
| B    | 1     |  Y    |
| B    | 2     |  Y    |
| B    | 3     |  Y    |

我写了一个递归更新查询。但是原来的 table 有数百万行。这将需要非常大量的递归,这在 Snowflake 中是不允许的。有没有其他方法可以实现我的目标?我正在考虑 window 功能,但不知道如何实现它。

您可以使用lag(ignore nulls) 来获取您想要的先前值。然后你可以使用 join:

update original o
    set value = prev_value
    from (select o.*,
                 lag(case when value <> 'Z' then value end ignore nulls) over (partition by user order by order) as prev_value
          from original o
         ) o2
    where o.value = 'Z' and
          o2.user = o.user and
          o2.order = o.user