使用Oracle 11g比较样本表中具有不同行和列的列

时间:2013-10-25 20:49:29

标签: oracle

这就是我想要实现的目标 -

考虑下表

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。

1 个答案:

答案 0 :(得分:2)

以下是其中一种方法,我们借助lag() over()分析函数将源数据划分为逻辑组,这允许我们引用结果集中的前一行case表达式来标记a组和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