SQL连续生成间隔
我在一个表中有混合间隔,需要从中连续生成间隔。像lead和leg这样具有分析功能的东西 不能使用Pl/SqlSQL连续生成间隔,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
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.