Oracle SQL - 用以前的已知值替换 null

Oracle SQL - replace null with previous known value

我想用我的 table 列中的先前已知值替换空值。我已经尝试并搜索了很多东西,但我似乎无法弄清楚该怎么做。如果有人可以提供帮助,那就太好了。提前致谢!

PROCESSO    DATAM   HOURM TEMP_T1
-------- ---------- ----- -------
508410   2015.03.29  19   36.15
508410   2015.03.30  11   NULL
508410   2015.03.30  14   NULL
508410   2015.03.30  15   35.36
508410   2015.03.30  23   36.52
508410   2015.03.31  11   NULL
508410   2015.04.01  02   37.06

我希望它看起来像这样:

PROCESSO    DATAM   HOURM TEMP_T1
-------- ---------- ----- -------
508410   2015.03.29  19   36.15
508410   2015.03.30  11   36.15
508410   2015.03.30  14   36.15
508410   2015.03.30  15   35.36
508410   2015.03.30  23   36.52
508410   2015.03.31  11   36.52
508410   2015.04.01  02   37.06

尝试last_value解析函数:

SELECT "PROCESSO", "DATAM", "HOURM",
       last_value( "TEMP_T1" ignore nulls )
       OVER (order by "DATAM"
             rows between unbounded preceding and current row
       ) as new_temp
FROM table1

演示 ==> http://sqlfiddle.com/#!4/48207/2

=========== 编辑 ===================

如果要更新table,并且没有主键(唯一标识符),可以尝试基于rowid伪列的解决方案
==>http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm) :

MERGE INTO table1 t1
USING (
    SELECT rowid rd, "PROCESSO", "DATAM", "HOURM",
           last_value( "TEMP_T1" ignore nulls )
           OVER (order by "DATAM"
                 rows between unbounded preceding and current row
           ) as new_temp
    FROM table1
) x
ON (t1.rowid = x.rd)
WHEN MATCHED THEN UPDATE SET t1."TEMP_T1" = x.new_temp
;

演示 ==> http://sqlfiddle.com/#!4/5a9a61/1

但是,您必须确保没有其他进程删除和插入行 from/into this table while 运行 update,因为当从 table 中删除行时,Oracle可以将其 rowid 分配给另一个新行。