【问题标题】:Replace first and last row having null values or missing values with previous/next available value in Postgresql12将具有空值或缺失值的第一行和最后一行替换为 Postgresql12 中的上一个/下一个可用值
【发布时间】:2020-05-12 21:58:28
【问题描述】:

我是 postgresql 的新手。 我想用下一个/上一个可用值替换我的第一行和最后一行表 T,它具有空值或缺失值。此外,如果中间有缺失值,则应将其替换为以前的可用值。例如:

id   value   EXPECTED
1              1
2    1         1
3    2         2
4              2
5    3         3
6              3

我知道有许多类似的线程,但似乎没有一个解决这个问题,即 start 和 end 也有缺失值(包括中间行中的一些缺失)。还有一些概念,例如 first_row 、partition by、top 1(不适用于 postgres)作为新手很难掌握。

到目前为止,我已经提到了以下线程:value from previous rowPrevious available value

有人可以指导我正确的方向来解决这个问题吗? 谢谢

【问题讨论】:

    标签: sql database postgresql rdbms


    【解决方案1】:

    不幸的是,Postgres 在lead()lag() 上没有ignore nulls 选项。在您的示例中,您只需要从下一行借。所以:

    select t.*,
           coalesce(value, lag(value) over (order by id), lead(value) over (order by id)) as expected
    from t;
    

    如果您连续有多个 NULL,那么这会比较棘手。一种解决方案是根据值开始或停止的时间来定义“组”。您可以使用值的累积计数来执行此操作 - 升序和降序:

    select t.*,
           coalesce(value,
                    max(value) over (partition by grp_before),
                    max(value) over (partition by grp_after)
                   ) as expected
    from (select t.*,
                 count(value) over (order by id asc) as grp_before,
                 count(value) over (order by id desc) as grp_after
          from t
         ) t;
    

    Here 是一个 dbfiddle。

    【讨论】:

      猜你喜欢
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2017-11-03
      相关资源
      最近更新 更多