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 之间有一些重叠,例如第 1 行 Col2(数据 3)与第 2 行 Col1(再次为数据 3)重叠,第 3 行 col2(数据 8)与第 4 行 col1(再次为数据 8)重叠。

如果我们看到这样的重叠,我们需要合并重叠,最终输出应该如下

预期结果

COL1 COL2
 1 4
 5 12
 13 15
 16 20

任何想法如何实现这一目标?

谢谢,S。

4

1 回答 1

2

这是其中一种方法,我们在分析函数的帮助下将源数据划分为逻辑组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 回答