如何 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
我有这样一种情况,我在 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