在Oracle中对重叠的时间间隔进行分组

时间:2015-11-26 20:30:28

标签: sql oracle date

Oracle 10g中有一个包含date_fromdate_to列的数据集(或者只是date_from,因为长度是常量)。

我需要折叠重叠间隔,例如这些行:

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

需要成为:

2015-01-01 2015-01-11

我想知道是否有一种方法可以在不使用游标的情况下一次性地查询这个...我的查询很大并且仍然不会在边缘情况下崩溃。也许在Oracle 10g中有一些SQL扩展用于我可以使用的问题吗?

1 个答案:

答案 0 :(得分: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);