2012-09-26 82 views
0

我有一個輸入的數據集,看起來像這樣:甲骨文解析函數

header1,null,null,null 
null,1,X,Y,Z 
null,2,X,Y,Z 
null,3,X,Y,Z 
header2,null,null,null 
null,4,X,Y,Z 
null,5,X,Y,Z 
null,6,X,Y,Z 

我想寫針對輸入一個查詢返回的結果集,看起來像這樣:

header1,1,X,Y,Z 
header1,2,X,Y,Z 
header1,3,X,Y,Z 
header2,4,X,Y,Z 
header2,5,X,Y,Z 
header2,6,X,Y,Z 

我在Oracle 11g R2上。我一直在尋找Oracle分析介紹發現在這裏: http://www.oracle-base.com/articles/misc/analytic-functions.php

我在想有一個解決方案,但我還沒有找到它。我認爲的問題是我沒有什麼可以真正分組的。我唯一的'指標'是重複標題值,直到我擊中一組空值,然後抓住下一個標題並重復它,直到我擊中一些空值。所以訂單很重要,但你可以看到我們沒有專欄排序。

下面是幾個快速腳本來構建測試表並插入行。

謝謝你。

create table test (
col01 varchar2(10), 
col02 varchar2(10), 
col03 varchar2(10), 
col04 varchar2(10)) 

insert into test values ('header1',null,null,null); 
insert into test values (1,'X','Y','Z'); 
insert into test values (2,'X','Y','Z'); 
insert into test values (3,'X','Y','Z'); 
insert into test values ('header2',null,null,null); 
insert into test values (4,'X','Y','Z'); 
insert into test values (5,'X','Y','Z'); 
insert into test values (6,'X','Y','Z'); 
+2

如果您沒有專欄來訂購,您如何期望Oracle執行排序? –

回答

2

試試這個

WITH CTE AS (
SELECT COL01, COL02, COL03, COL04, 
CASE WHEN COL01 LIKE 'header%' THEN col01 else null END NEW_COL01 
FROM TESTTable 
) 

SELECT * FROM (
SELECT COL01, COL02, COL03, COL04, 
CASE WHEN NEW_COL01 IS NULL 
THEN LAG(NEW_COL01 IGNORE NULLS) OVER (ORDER BY ROWID) END HEAD_COL 
FROM CTE 
) WHERE col01 not like 'header%'; 
+0

很酷。那是票。謝謝。 – John

2

LAG是答案,但你還是需要依靠該行總是以相同的順序,然後你可以使用rowid

看那SQL Fiddle

select * 
    from 
    (select case when header is null 
       then lag(header ignore nulls) over (order by rowid) 
      end header,col01,col02,col03,col04 
     from 
     (select case when col01 like 'header%' 
        then col01 
       end header,col01,col02,col03,col04 
     from test) 
    ) 
where header is not null 

我希望這是處理表一次,並把它變成一個合適的數據模型,因爲表的設計是不是很不錯的設計,但我想你已經知道了。