SQL连续生成间隔

SQL连续生成间隔,sql,oracle,intervals,Sql,Oracle,Intervals,我在一个表中有混合间隔,需要从中连续生成间隔。像lead和leg这样具有分析功能的东西 不能使用Pl/Sql ID | BEGIN| END 1 | 1 | 2 2 | 1 | 3 3 | 2 | 4 4 | 3 | 5 5 | 4 | 9 6 | 5 | 9 预期选择结果: ID | BEGIN| END 1 | 1 | 2 2 | 2 | 3 3 | 3 | 4 4 | 4 | 5 5 | 5 | 9

我在一个表中有混合间隔,需要从中连续生成间隔。像lead和leg这样具有分析功能的东西

不能使用Pl/Sql

ID | BEGIN| END
1  | 1    | 2
2  | 1    | 3
3  | 2    | 4
4  | 3    | 5
5  | 4    | 9
6  | 5    | 9
预期选择结果:

ID | BEGIN| END
1  | 1    | 2
2  | 2    | 3
3  | 3    | 4
4  | 4    | 5
5  | 5    | 9

感谢您的帮助。

如果您使用的是实际支持的oracle版本,则可以使用横向或交叉应用:

如您所见,我们只需在横向生成行,然后计算新的begin2和end2。 我添加了原始的开始和结束,只是为了让它更具可读性。显然,我们可以忽略它们:

选择 不同的t.id,v.begin2,v.end2 从t ,侧向选择t.begin+level-1作为起点2 ,t.开始+级别为结束2 来自双重
通过t.begin+level连接您的oracle版本是什么?
--your test data:
with t(ID, BEGIN, END) as (
select 1, 1, 2 from dual union all
select 2, 1, 3 from dual union all
select 3, 2, 4 from dual union all
select 4, 3, 5 from dual union all
select 5, 4, 9 from dual union all
select 6, 5, 9 from dual
)-- end of your test data
--main query:
select 
  distinct t.id,t.begin,t.end,v.begin2,v.end2
from t
    ,lateral(select t.begin+level-1 as begin2
                  , t.begin+level as end2
             from dual
             connect by t.begin+level<=t.end)
             v
order by t.id,t.begin,t.end,v.begin2,v.end2;
        ID      BEGIN        END     BEGIN2       END2
---------- ---------- ---------- ---------- ----------
         1          1          2          1          2
         2          1          3          1          2
         2          1          3          2          3
         3          2          4          2          3
         3          2          4          3          4
         4          3          5          3          4
         4          3          5          4          5
         5          4          9          4          5
         5          4          9          5          6
         5          4          9          6          7
         5          4          9          7          8
         5          4          9          8          9
         6          5          9          5          6
         6          5          9          6          7
         6          5          9          7          8
         6          5          9          8          9

16 rows selected.