Oracle SQL-查找自动增量列的源ID

Oracle SQL-查找自动增量列的源ID,sql,oracle,group-by,subquery,oracle-sqldeveloper,Sql,Oracle,Group By,Subquery,Oracle Sqldeveloper,我的ERP数据库中有一个表,其中包含有关特定事件的数据。它有开始日期、结束日期,并有一列显示事件是否是前一个事件的延续(顺序_id引用唯一的_id)。下面是一个例子: 唯一标识 开始日期 结束日期 序列号 001 2021-01-01 2021-01-15 002 2021-02-01 2021-02-16 001 003 2021-03-01 2021-03-17 002 004 2021-03-10 2021-03-11 005 2021-03-19 您可以对此使用分层查询: 唯一的|开始|

我的ERP数据库中有一个表,其中包含有关特定事件的数据。它有开始日期、结束日期,并有一列显示事件是否是前一个事件的延续(顺序_id引用唯一的_id)。下面是一个例子:

唯一标识 开始日期 结束日期 序列号 001 2021-01-01 2021-01-15 002 2021-02-01 2021-02-16 001 003 2021-03-01 2021-03-17 002 004 2021-03-10 2021-03-11 005 2021-03-19
您可以对此使用分层查询:

唯一的|开始|日期|结束|日期 :-------- | :--------- | :-------- 001 | 01-JAN-21 | 17-MAR-21 004年3月10日21日11日21日 005 | 21年3月19日|空
dbfiddle

您可以使用分层查询:

唯一的|开始|日期|结束|日期 :-------- | :--------- | :-------- 001 | 01-JAN-21 | 17-MAR-21 004年3月10日21日11日21日 005 | 21年3月19日|空
DBFIDLE

这是一个图形漫游问题,因此可以使用递归CTE:

with cte (unique_id, start_date, end_date, start_unique_id) as (
      select unique_id, start_date, end_date, unique_id
      from t
      where not exists (select 1 from t t2 where t.sequential_id = t2.unique_id)
      union all
      select t.unique_id, t.start_date, t.end_date, cte.start_unique_id
      from cte join
           t
           on cte.unique_id = t.sequential_id
     )
select start_unique_id, min(start_date), max(end_date)
from cte
group by start_Unique_id;

这是一个图遍历问题,因此可以使用递归CTE:

with cte (unique_id, start_date, end_date, start_unique_id) as (
      select unique_id, start_date, end_date, unique_id
      from t
      where not exists (select 1 from t t2 where t.sequential_id = t2.unique_id)
      union all
      select t.unique_id, t.start_date, t.end_date, cte.start_unique_id
      from cte join
           t
           on cte.unique_id = t.sequential_id
     )
select start_unique_id, min(start_date), max(end_date)
from cte
group by start_Unique_id;

是一种数据小提琴。

您可以使用现代的
匹配_识别
这是此类任务的最佳解决方案:

选择*
从t
相配(
措施
第一个(唯一\u id)开始\u唯一\u id,
第一个(开始日期)开始日期,
最后(结束日期)结束日期
模式(strt nxt*)
将nxt定义为顺序\u id=prev(唯一\u id)
);

您可以使用modern
match\u Recognite
这是此类任务的最佳解决方案:

选择*
从t
相配(
措施
第一个(唯一\u id)开始\u唯一\u id,
第一个(开始日期)开始日期,
最后(结束日期)结束日期
模式(strt nxt*)
将nxt定义为顺序\u id=prev(唯一\u id)
);
with cte (unique_id, start_date, end_date, start_unique_id) as (
      select unique_id, start_date, end_date, unique_id
      from t
      where not exists (select 1 from t t2 where t.sequential_id = t2.unique_id)
      union all
      select t.unique_id, t.start_date, t.end_date, cte.start_unique_id
      from cte join
           t
           on cte.unique_id = t.sequential_id
     )
select start_unique_id, min(start_date), max(end_date)
from cte
group by start_Unique_id;