更新从同一列获取数据的列

时间:2013-03-12 05:55:57

标签: sql oracle

我有一个表格和数据看起来像这样我想填写日期例如:-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

先谢谢。

3 个答案:

答案 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;

查看Fiddle here

答案 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;

这显然是未经测试的,所以请告诉我它是否有帮助!