【问题标题】:Snowflake fill null values雪花填充空值
【发布时间】:2021-12-10 20:41:11
【问题描述】:

我在 Snowflake 中有一个这样的表,其中有一个“类”列,其中所有级别为 1 的行都有一个值。我想要一个新列“WANTED_OUTPUT”,其中填充类中的值,直到出现新值,然后填充该值。

我一直在研究 first_value 和 last_value 函数,但我错过了一些东西,可以将所有行从级别 1 到下一个级别 1 “分组”在一起,然后我才能使用 first_value 和分区。

有什么建议吗?

+----+-------+-------+-------+---------------+
| id | col_c | level | class | WANTED_OUTPUT |
+----+-------+-------+-------+---------------+
| a  | q1    | 1     | c99   | c99           |
+----+-------+-------+-------+---------------+
| a  | w2    | 2     | NULL  | c99           |
+----+-------+-------+-------+---------------+
| a  | g6    | 2     | NULL  | c99           |
+----+-------+-------+-------+---------------+
| a  | j5    | 3     | NULL  | c99           |
+----+-------+-------+-------+---------------+
| a  | x8    | 1     | c3    | c3            |
+----+-------+-------+-------+---------------+
| a  | x9    | 2     | NULL  | c3            |
+----+-------+-------+-------+---------------+
| a  | h5    | 1     | c67   | c67           |
+----+-------+-------+-------+---------------+

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    使用FIRST/LAST_VALUE

    SELECT *,
       FIRST_VALUE(class) IGNORE NULLS OVER (PARTITION BY id ORDER BY level) AS wanted
    FROM tab;
    

    表在设计上是无序集,因此需要稳定的排序。根据提供的输入,级别可能不够。


    建议:最好添加明确的时间戳或 seq id 列以提供稳定的排序列。

    SELECT tab.*,    
       LAST_VALUE(class) IGNORE NULLS OVER (PARTITION BY id 
                         ORDER BY rn
                         RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                        ) AS wanted 
    FROM tab;
    

    db<>fiddle demo

    【讨论】:

    • 在我的小示例中,第 1 到第 4 行是基于我的 ID 列和级别的同一组和第 5-6 行是另一个组相同 ID,但是新的“级别 1”和第 7 行是不是自己的组,我的东西应该翻译成“helper”列来分区过来。但我不知道该怎么做。
    • @jvels 你可以建立一些不可靠的行为,但没有稳定的排序是不可行的。 WITH cte AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY id ORDER BY id) AS rn FROM tab) SELECT *, FIRST_VALUE(class) IGNORE NULLS OVER (PARTITION BY id ORDER BY rn) AS wanted FROM cte; - 这里有一个隐含的假设,而不是在创建 rn 时,数据在插入时被读取。我建议添加显式时间戳或 id 列以提供稳定的排序列。
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多