【问题标题】:Fill in values with the most recent non null with Snowflake SQL使用 Snowflake SQL 用最近的非 null 填充值
【发布时间】:2021-01-18 23:38:47
【问题描述】:

这是我的值表

id    category   

A     Apple
A     NULL     
A     Apple
B     NULL      
B     Pear
B     Pear
B     Peach
B     NULL
B     NULL
C     NULL
C     NULL
C     Apple

这就是我想要的桌子

id    category   

A     Apple
A     Apple     
A     Apple
B     NULL      
B     Pear
B     Pear
B     Peach
B     Peach
B     Peach
C     NULL
C     NULL
C     Apple

这些是我要应用的规则;

  • 如果 category 为 null,则使用最新的类别(针对该 id)填写它
  • 如果该 id 的上述类别没有值,则保持为空

我们可以想象有第三列称为日期,这就是数据的排序依据

我尝试使用first_value(),但我只是得到了类别列的空值

我在 Snowflake 实例上使用 SQL

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    你似乎想要lag(. . . ignore nulls)。只有一件事:SQL 表代表 无序 集(技术上是多集)。您需要一列来指定顺序。

    所以:

    select t.*,
           coalesce(lag(category ignore nulls) over (partition by id order by <ordering col>) as imputed_category
    from t;
    

    实际上,last_value() 不需要coalesce() 就可以做到这一点:

    select t.*,
           last_value(category ignore nulls) over (partition by id order by <ordering col>) as imputed_category
    from t;
    

    【讨论】:

    • 这个值和第一个值有什么区别?
    • @Cauder 。 . . first_value() 获取出现的第一个值。 lag()last_value() 获取最新的行——当然基于一些排序列。
    • 我是否需要在最后一个值上添加一个窗口框架,以便它获取当前行的最新值?与在以下行中包含值相反
    • 我认为 first_value 或 last_value 也可以,但是 ID = B 意味着 LAG() 与合并是要走的路。
    • 这就是我的选择:coalesce(category, last_value(category ignore nulls) over (partition by id order by date rows between unbounded preceding and current row))
    【解决方案2】:

    语法是:

    FIRST_VALUE( ) [ { 忽略 |尊重}空] OVER ( [ PARTITION BY ] ORDER BY [ { ASC | DESC } ] [ ] )

    默认为IGNORE NULLS,但如果您指定IGNORE NULLS,您将不会得到它们。

    这里是文档链接,如果需要的话:

    https://docs.snowflake.com/en/sql-reference/functions/first_value.html

    【讨论】:

    • 这是否适用于示例表中的 ID = B?我想知道它是否会选择梨而不是桃子
    • 啊,不,你的结果比我最初的结果更有趣,我没有仔细研究那里的细节。这是一个更复杂的查询,因为您正在寻找系列中最后一个不为空的值,而不是系列中的第一个值。请改用LAG()
    猜你喜欢
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多