我有一个表格和数据看起来像这样我想填写日期例如:-1-5应该有日期2/8/2012,6-9应该有日期: - 8月2日
1 2/8/2012 G8-212
2 null G8 711
3 null G8-719
4 null G8 331
5 null G8 320
6 8-Feb G8 172
7 null G8 606
8 null G8 176
9 null G8 372
最终结果应该是这样的
1 2/8/2012 G8-212
2 2/8/2012 G8 711
3 2/8/2012 G8-719
4 2/8/2012 G8 331
5 2/8/2012 G8 320
6 8-Feb G8 172
7 8-Feb G8 606
8 8-Feb G8 176
9 8-Feb G8 372
先谢谢。
答案 0 :(得分:1)
这样的事情:
select
id,
nvl(date_column,last_value(date_column ignore nulls) over (order by id)) as date_col,
code
from your_table
order by id;
答案 1 :(得分:1)
请尝试使用合并:
merge into YourTable a
using (
SELECT ID,
ColumnName,
nvl(ColumnName,last_value(ColumnName ignore nulls) over (order by ID)) as ColumnName_A
FROM YourTable
) b
on (a.ID = b.ID)
when matched then
update set a.ColumnName = NVL(b.ColumnName, b.ColumnName_A)
答案 2 :(得分:-1)
假设您在第一列上排序,您可以尝试这样做: (注意:我不熟悉Oracle / PLSQL语法,因此请仔细考虑这些问题。)
首先,您需要获取非空行的所有索引及其值:
SELECT col1, col2
FROM table1
WHERE col2 IS NOT NULL
现在,循环查看此查询的结果并根据需要更新列:
DECLARE
CURSOR v_cols IS
SELECT col1, col2 FROM table1 WHERE col2 IS NOT NULL;
Int previousIndex := 0;
BEGIN
FOR v_col IN v_cols LOOP
UPDATE col2
SET col2 = v_col.col2
WHERE col1 < v_col.col1 AND col1 > previousIndex;
previousIndex := v_col.col1;
END LOOP;
END;
这显然是未经测试的,所以请告诉我它是否有帮助!