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
我在 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