2013-03-12 24 views
0

我有一個表格和數據看起來像這樣我想填寫日期例如:-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

回答

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

+0

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

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

這顯然是未經測試,所以讓我知道,如果有幫助!

+0

謝謝回答,但使用(最後一個值)分析函數將完成這項工作罰款..我要試試這個代碼,讓你知道。謝謝你的幫助。 – 2013-03-12 09:28:21

+0

沒問題!我以前從未使用過nvl,所以我也學到了一些東西。 – crazylpfan 2013-03-12 20:36:25

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)