【问题标题】:Recursive update in SnowflakeSnowflake 中的递归更新
【发布时间】:2021-04-16 00:00:29
【问题描述】:

我在雪花中有一张供不同用户使用的表格。如果有“Z”值,我需要更新值列。 Z 将被替换为与该用户最接近的非 Z 值。

原表:

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

目标表:

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

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

【问题讨论】:

    标签: sql data-science etl snowflake-cloud-data-platform data-analysis


    【解决方案1】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 2021-11-04
      • 1970-01-01
      • 2017-07-07
      • 2020-09-05
      • 2012-03-17
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多