3

これは私が達成しようとしていることです -

以下の表を検討してください

CREATE TABLE SAMPLE_TAB
(
COL1  NUMBER,
COL2  NUMBER
)

データは次のとおりです-

INSERT INTO sample_tab
VALUES (1 ,3);

INSERT INTO sample_tab
VALUES (3 ,4);

INSERT INTO sample_tab
VALUES (5 ,8)

INSERT INTO sample_tab
VALUES (8 ,12);

INSERT INTO sample_tab
VALUES (13 ,15);

INSERT INTO sample_tab
VALUES (16 ,20);

実際のデータ

COL1 COL2
 1 3
 3 4
 5 8
 8 12
 13 15
 16 20

お気づきのように、データは col2 と col1 の間で重複しています。たとえば、Row 1 Col2 (データ 3) は Row 2 Col1 (データ 3 が再び) とオーバーラップし、Row 3 col2 (データ 8) は Row 4 col1 (データ 8 が再び) とオーバーラップします。

このようなオーバーラップが見られる場合は、オーバーラップを結合する必要があり、最終的な出力は次のようになります。

期待される結果

COL1 COL2
 1 4
 5 12
 13 15
 16 20

これを達成する方法はありますか?

ありがとう、S.

4

1 に答える 1

2

これは、分析関数を使用してソース データを論理グループに分割するアプローチの 1 つですlag() over()。これにより、結果セット内の前の行を参照しcase、グループをマークする式と、グループsum() over()を形成する分析関数を使用できます。最後に、グループ内の最小col1値と最大値を抽出します。col2

with t1 as(
  select col1
       , col2
       , sum(grp) over(order by col1) as grp
    from (select col1
               , col2
               , case 
                   when col1 <> lag(col2) over(order by col1)
                   then 1
                   else 0
                end as grp
           from sample_tab
         )
)
select min(col1) as col1
     , max(col2) as col2
  from t1
 group by grp
 order by col1

結果:

      COL1       COL2
---------- ----------
         1          4 
         5         12 
        13         15 
        16         20 
于 2013-10-25T21:03:28.937 に答える