Имеется таблица с интервалами дат. Необходимо написать запрос, который позволит объединить периоды, которые пересекаются или граничат.
Пример данных:
CREATE TABLE "T_DT" ("BEG_DATE" DATE, "END_DATE" DATE ) NOLOGGING TABLESPACE MIRAVILD_DATA; / INSERT INTO t_dt (beg_date, end_date) VALUES (to_date('01.12.2013', 'dd.mm.yyyy'), to_date('31.12.2013', 'dd.mm.yyyy')); INSERT INTO t_dt (beg_date, end_date) VALUES (to_date('01.02.2014', 'dd.mm.yyyy'), to_date('10.02.2014', 'dd.mm.yyyy')); INSERT INTO t_dt (beg_date, end_date) VALUES (to_date('05.02.2014', 'dd.mm.yyyy'), to_date('28.02.2014', 'dd.mm.yyyy')); INSERT INTO t_dt (beg_date, end_date) VALUES (to_date('01.04.2014', 'dd.mm.yyyy'), to_date('30.04.2014', 'dd.mm.yyyy')); INSERT INTO t_dt (beg_date, end_date) VALUES (to_date('05.04.2014', 'dd.mm.yyyy'), to_date('10.04.2014', 'dd.mm.yyyy')); INSERT INTO t_dt (beg_date, end_date) VALUES (to_date('15.04.2014', 'dd.mm.yyyy'), to_date('20.04.2014', 'dd.mm.yyyy')); INSERT INTO t_dt (beg_date, end_date) VALUES (to_date('01.06.2014', 'dd.mm.yyyy'), to_date('15.06.2014', 'dd.mm.yyyy')); INSERT INTO t_dt (beg_date, end_date) VALUES (to_date('16.06.2014', 'dd.mm.yyyy'), to_date('30.06.2014 ', 'dd.mm.yyyy')); COMMIT WORK; /
Вариант запроса:
SELECT UNIQUE first_value(trunc(t_dt.beg_date, 'MM')) over(PARTITION BY t_dt.beg_date) AS beg_date, last_value(last_day(t_dt.end_date)) over(PARTITION BY t_dt.end_date) AS end_date FROM t_dt ORDER BY beg_date; /
Результат:
BEG_DATE END_DATE 01.12.2013 31.12.2013 01.02.2014 28.02.2014 01.04.2014 30.04.2014 01.06.2014 30.06.2014
P.S.
Конфигурация СУБД — Oracle Database 11g Express Edition Release 11.2.0.2.0
IDE — PL/SQL Developer Version 11.0.6.1776