2015-11-26 5 views
0

Существует набор данных с колонками date_from и date_to в Oracle 10g (или, скорее, только date_from, поскольку длина является постоянной).Группирование перекрывающихся временных интервалов в Oracle

Мне нужно свернуть перекрывающиеся интервалы, например. эти строки:

date_from date_to 
2015-01-01 2015-01-10 
2015-01-03 2015-01-11 

должны стать:

2015-01-01 2015-01-11 

Интересно, если есть способ запроса это аккуратно в один присест без использования курсоров ... мой запрос огромен, и до сих пор не свернуть все в крайних случаях. Может быть, есть некоторое расширение SQL в Oracle 10g для таких проблем, которые я могу использовать?

ответ

2
WITH data (date_from, date_to) AS (
    SELECT DATE'2015-01-01', DATE'2015-01-10' FROM DUAL UNION ALL 
    SELECT DATE'2015-01-03', DATE'2015-01-11' FROM DUAL 
) 
SELECT 
    min(date_from) date_from, max(date_to) date_to 
FROM (
    SELECT 
     date_from, date_to, 
     sum(merge) OVER (ORDER BY date_from) group_id 
    FROM (
     SELECT 
      date_from, date_to, 
      case when date_from <= lag(date_to) OVER (ORDER BY date_from) 
       THEN 0 
       ELSE 1 
      end as merge 
     FROM data) 
    ) intervals 
GROUP BY group_id 
ORDER BY min(intervals.date_from); 
+0

Какое колдовство это ?! Большое спасибо, 'LAG() OVER()' это то, что я искал. – Yuriy

Смежные вопросы