有趣的问题。请问你在哪里找到的?下面是我的提议。我还没有彻底测试它,但我会的,因为我也有兴趣找到一个合适的解决方案来解决这个问题。困难的部分是找到该START WITH
子句的所有记录,但对于我用于测试的数据,它返回了正确的结果集。我希望有人会发布一个更简单的解决方案,也许使用分析函数(我自己没有成功)。
好的,代码如下:
CREATE TABLE my_data (
id NUMBER,
start_date DATE,
end_date DATE,
line NUMBER
);
INSERT INTO my_data VALUES (1, DATE '2013-08-25', DATE '2013-08-27', 1);
INSERT INTO my_data VALUES (1, DATE '2013-08-27', DATE '2013-08-30', 2);
INSERT INTO my_data VALUES (2, DATE '2013-08-20', DATE '2013-08-27', 1);
INSERT INTO my_data VALUES (2, DATE '2013-09-01', DATE '2013-09-04', 2);
INSERT INTO my_data VALUES (2, DATE '2013-09-04', DATE '2013-09-05', 3);
INSERT INTO my_data VALUES (2, DATE '2013-09-05', DATE '2013-09-07', 4);
COMMIT;
SELECT
id,
root_start_date AS start_date,
MAX(end_date) AS end_date
FROM (
SELECT
id,
start_date,
end_date,
CONNECT_BY_ROOT start_date AS root_start_date
FROM my_data
START WITH (id, start_date) IN (
SELECT id, start_date
FROM my_data md
WHERE
NOT EXISTS (
SELECT 1
FROM my_data
WHERE id = md.id
AND md.start_date BETWEEN start_date AND end_date
AND end_date < md.end_date
)
)
CONNECT BY start_date >= PRIOR start_date
AND start_date <= PRIOR end_date
AND end_date > PRIOR end_date
AND id = PRIOR id
)
GROUP BY id, root_start_date
ORDER BY id, start_date
;
结果:
ID START_DATE END_DATE
---------- ---------- --------
1 13/08/25 13/08/30
2 20 年 8 月 13 日 27 年 8 月 13 日
2 01 年 9 月 13 日 07 年 9 月 13 日