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');
4

2 に答える 2

2

LAGが答えですが、行が常に同じ順序で来ることを信頼する必要があります。そうすれば、を使用できますrowid

SQLフィドルを見てください

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

テーブルのデザインはあまり良いデザインではないので、これがテーブルを1回処理して適切なデータモデルに取り込むことであることを願っていますが、すでにご存知だと思います。

于 2012-09-26T20:44:09.240 に答える
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%';
于 2012-09-26T16:32:49.740 に答える