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

问题描述:

我有一个表格和数据看起来像这样我想填写日期例如:-1-5应该有日期2012年2月8日和6-9应该有日期: - 8 -Feb更新从同一列获取数据的列

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

不无某种排序顺序。你怎么知道2-5跟1? – paxdiablo 2013-03-12 06:00:08

+0

什么是第一列的类型,应该是VARCHAR,然后你可以使用dateformat来施放相同的命令,但是这个命令依赖于你正在使用的SQL引擎。共享服务器名称(mysql或oracle等)。 – 2013-03-12 06:01:08

+0

我使用的Oracle和1,2和3列的数据类型是Int,varchar(),varchar()。如果需要,我可以更改数据类型。 – 2013-03-12 06:11:30

事情是这样的:

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

+0

感谢弗洛林....最好的一个... – 2013-03-12 06:57:22

你可以尝试做这样的事情,假设你正在排序的第一列: (注:我不熟悉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; 

这显然是未经测试,所以让我知道,如果有帮助!

+0

谢谢回答,但使用(最后一个值)分析函数将完成这项工作罚款..我要试试这个代码,让你知道。谢谢你的帮助。 – 2013-03-12 09:28:21

+0

没问题!我以前从未使用过nvl,所以我也学到了一些东西。 – crazylpfan 2013-03-12 20:36:25

请尝试使用合并:

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)