这就是我想要实现的目标 -
考虑下表
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。
答案 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