| Combining overlapping dates [message #563606] |
Wed, 15 August 2012 16:41  |
 |
anjulis
Messages: 32 Registered: August 2012
|
Member |
|
|
Lets say I have a table with 4 records with start_date and end_date fields
start_date end_date
1/1/2003 1/4/2005
1/1/2004 5/3/2006
1/1/2007 1/4/2008
1/1/2008 6/3/2009
as you see records 1,2 and records 3,4 have overlapping dates. I need to combine them to get continuous intervals. The result should be:
start_date end_date
1/1/2003 5/3/2006
1/1/2007 6/3/2009
Is it possible to do by SQL query?
|
|
|
|
|
|
|
|
|
|
|
|
| Re: Combining overlapping dates [message #563650 is a reply to message #563606] |
Thu, 16 August 2012 06:00   |
Solomon Yakobson
Messages: 1398 Registered: January 2010
|
Senior Member |
|
|
anjulis wrote on Wed, 15 August 2012 17:41Is it possible to do by SQL query?
WITH t AS (
SELECT TO_DATE('1/1/2003','mm/dd/yyyy') start_date,TO_DATE('1/4/2005','mm/dd/yyyy') end_date FROM dual
UNION ALL
SELECT TO_DATE('1/1/2004','mm/dd/yyyy') start_date,TO_DATE('5/3/2006','mm/dd/yyyy') end_date FROM dual
UNION ALL
SELECT TO_DATE('1/1/2007','mm/dd/yyyy') start_date,TO_DATE('1/4/2008','mm/dd/yyyy') end_date FROM dual
UNION ALL
SELECT TO_DATE('1/1/2008','mm/dd/yyyy') start_date,TO_DATE('6/3/2009','mm/dd/yyyy') end_date FROM dual
)
SELECT min(start_date) start_date,
max(end_date) end_Date
FROM (
SELECT start_date,
end_date,
sum(start_of_group) over(order by start_date,end_date) grp
FROM (
select start_date,
end_date,
case
when start_date
> 1 + max(end_date) over(order by start_date,end_date rows between unbounded preceding and 1 preceding) then 1
end start_of_group
FROM t
)
)
GROUP BY grp
ORDER BY 1
/
START_DAT END_DATE
--------- ---------
01-JAN-03 03-MAY-06
01-JAN-07 03-JUN-09
SQL>
SY.
[Updated on: Thu, 16 August 2012 06:19] by Moderator Report message to a moderator
|
|
|
|
| Re: Combining overlapping dates [message #563651 is a reply to message #563606] |
Thu, 16 August 2012 06:02   |
Solomon Yakobson
Messages: 1398 Registered: January 2010
|
Senior Member |
|
|
And MODEL solution:
WITH t AS (
SELECT TO_DATE('1/1/2003','mm/dd/yyyy') start_date,TO_DATE('1/4/2005','mm/dd/yyyy') end_date FROM dual UNION ALL
SELECT TO_DATE('1/1/2004','mm/dd/yyyy') start_date,TO_DATE('5/3/2006','mm/dd/yyyy') end_date FROM dual UNION ALL
SELECT TO_DATE('1/1/2007','mm/dd/yyyy') start_date,TO_DATE('1/4/2008','mm/dd/yyyy') end_date FROM dual UNION ALL
SELECT TO_DATE('1/1/2008','mm/dd/yyyy') start_date,TO_DATE('6/3/2009','mm/dd/yyyy') end_date FROM dual
)
SELECT start_date,
end_date
FROM t
MODEL
RETURN UPDATED ROWS
DIMENSION BY(
ROW_NUMBER() OVER(ORDER BY start_date) rn
)
MEASURES(
start_date,
end_date,
1 i
)
RULES ITERATE(1e9) UNTIL(start_date[iteration_number + 2] IS NULL)
(
end_date[i[1]] = CASE
WHEN start_date[iteration_number + 2] <= end_date[i[1]] + 1
THEN GREATEST(end_date[i[1]],end_date[iteration_number + 2])
ELSE end_date[i[1]]
END,
i[1] = CASE
WHEN start_date[iteration_number + 2] > end_date[i[1]] + 1
THEN iteration_number + 2
ELSE i[1]
END
)
ORDER BY end_date
/
START_DAT END_DATE
--------- ---------
01-JAN-03 03-MAY-06
01-JAN-07 03-JUN-09
SQL>
SY.
[Updated on: Thu, 16 August 2012 06:19] by Moderator Report message to a moderator
|
|
|
|
|
|
|
|
|
|
|
|