我正在try 编写一个查询以获取会员的连续订阅日期,但无法提取如下场景,其中end_Date在会员的几个日期范围内重叠,请帮助在Oracle中提供逻辑/查询.
[Data表中][1]
ID | Start_date | End_date |
---|---|---|
12345 | 07-Aug-15 | 07-Aug-65 |
12345 | 22-Aug-15 | 01-Jan-16 |
12345 | 24-Mar-16 | 23-Mar-66 |
12345 | 06-Jul-16 | 31-Dec-17 |
12345 | 31-Dec-16 | 31-Dec-41 |
46628 | 22-Aug-15 | 22-Dec-15 |
46628 | 01-Jan-16 | 01-Aug-18 |
46628 | 10-Jun-17 | 31-Dec-18 |
46628 | 01-Dec-18 | 04-Dec-72 |
[预期数据][2]
ID | Start_date | End_date |
---|---|---|
12345 | 07-Aug-15 | 23-Mar-66 |
46628 | 22-Aug-15 | 22-Dec-15 |
46628 | 01-Jan-16 | 04-Dec-72 |
以下是我正在使用的逻辑,但没有给出预期的结果,请帮助.
SELECT ID,
START_DATE,
END_DATE
FROM (
SELECT ID,
CONNECT_BY_ROOT START_DATE START_DATE,
DAYS_DIFF,
END_DATE,
PREV_END,
CONNECT_BY_ISLEAF ISLEAF
FROM (
SELECT ID,
DAYS_DIFF,PREV_END, START_DATE,END_DATE
FROM (
SELECT ID,
ROUND(START_DATE-PREV_END) DAYS_DIFF,
CASE
WHEN START_DATE<=PREV_END THEN PREV_END
END PREV_END,
START_DATE,END_DATE
FROM (
SELECT ID,
LAG(END_DATE) OVER (PARTITION BY ID ORDER BY START_DATE) PREV_END,
START_DATE,
END_DATE
FROM TEST_TABLE A
)
)
)
CONNECT BY ID= PRIOR ID AND PREV_END= PRIOR END_DATE START WITH PREV_END IS NULL
) WHERE ISLEAF=1;