Oracle sql- 用 next 和 p 替换 null

Oracle sql- replace null with next and p

我正在尝试 UPDATE 一个 table 并替换 NULL 值,但要满足某些条件。我在下面创建了一个示例,并按案例对其进行排序,以帮助说明我的条件适用于何处。

1º - 如果存在 NULL 值,则应将其替换为先前的已知值。 (案例 1-3)

2º - 当有两个连续的 NULLID 变化时。我希望它从 ID 5 中选择前一个已知值,然后从 ID 6 中选择下一个已知值,无论哪个 DATE。 (案例 4-5)

ID     DATE     HOUR   VAL        CASE
--  ---------- ----- -------     ------
5   2015.03.29  16   15.45         1
5   2015.03.30  13   NULL          2
5   2015.03.30  14   33.45         3
5   2015.03.31  15   NULL          4
6   2015.02.27  03   NULL          5
6   2015.02.27  04   76.77         6

它应该是这样的:

ID     DATE     HOUR   VAL        CASE
--  ---------- ----- -------     ------
5   2015.03.29  16   15.45         1
5   2015.03.30  13   15.45         2
5   2015.03.30  14   33.45         3
5   2015.03.31  15   33.45         4
6   2015.02.27  03   76.77         5
6   2015.02.27  04   76.77         6

我已经成功完成了我的 1º 条件,尽管我看不出我将如何实施 CASE 4-5。我已经尝试了很多方法,但我不明白该怎么做。

即使我在这里做 UPDATE,如果有人知道如何只用 SELECT,我可以导出结果,然后再次 INSERT,但如果您可以添加到此查询中,我将不胜感激。感谢您的帮助!

MERGE INTO DADOS t1
USING (
    SELECT rowid rd, "ID", "DATE", "HOUR",
           last_value( "VAL" ignore nulls )
           OVER (order by "DATE"
                 rows between unbounded preceding and current row
           ) as newVAL
    FROM DADOS
) x
ON (t1.rowid = x.rd)
WHEN MATCHED THEN UPDATE SET t1."VAL" = x.newVAL;

您可以在 merge 语句中使用类似于此查询的内容,它产生了所需的输出:

select id, tdate, hour, coalesce(val, v1, v2) val 
  from (
    select id, tdate, hour, val, 
        lag (val ignore nulls) over (partition by id order by tdate, hour) v1,
        lead(val ignore nulls) over (partition by id order by tdate, hour) v2
      from dados)
  order by id, tdate, hour

SQLFiddle