如何 Select 按开始日期和结束日期连接的所有连续行

How to Select All Continuous rows joining by begin and end date

我有这样一种情况,我在 table 中有多行,但它们可以分配给一个通用名称 id

NAMEID ID STARTDATE ENDDATE
10960 1 17-FEB-20 17-FEB-20
11210 2 17-FEB-20 18-FEB-20
10960 3 19-FEB-20 21-FEB-20
10960 4 21-FEB-20 02-MAR-20
11461 5 21-FEB-20 02-MAR-20
10960 6 01-MAR-20 06-MAR-20
10960 7 02-MAR-20 04-MAR-20

假设我想通过 ID 7 和 name_id 10960 进行查询 我想要 select ID 为 7、4、3 的行,因为这些是基于开始和结束日期的连接记录。

您可以使用递归 CTE 获取所有相关行。

例如:

with
n (nameid, id, startdate, enddate) as (
  select nameid, id, startdate, enddate from t where id = 7 -- starting row
 union all
  select t.nameid, t.id, t.startdate, t.enddate
  from n
  join t on t.nameid = n.nameid and t.enddate = n.startdate
)
select * from n;

结果:

 NAMEID  ID  STARTDATE  ENDDATE   
 ------- --- ---------- --------- 
 10960   7   02-MAR-20  04-MAR-20 
 10960   4   21-FEB-20  02-MAR-20 
 10960   3   19-FEB-20  21-FEB-20 

参见 db<>fiddle 中的示例。

您可以使用 CONNECT BY 到 return 行,方法是选择起点并限制要遍历的 nameid 行。

    SELECT *
      FROM names
CONNECT BY enddate = PRIOR startdate AND nameid = PRIOR nameid
START WITH id = 7;
   NAMEID    ID    STARTDATE      ENDDATE
_________ _____ ____________ ____________
    10960     7 02-MAR-20    04-MAR-20
    10960     4 21-FEB-20    02-MAR-20
    10960     3 19-FEB-20    21-FEB-20