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 分配给另一个新行。
我想用我的 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 分配给另一个新行。