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

Posted

技术标签:

【中文标题】在 Oracle 中对重叠的时间间隔进行分组【英文标题】:Grouping overlapping time intervals in Oracle 【发布时间】:2015-11-26 20:30:27 【问题描述】:

在 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】:
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);

【讨论】:

这是什么魔法?!非常感谢,LAG() OVER() 是我一直在寻找的。​​span>

以上是关于在 Oracle 中对重叠的时间间隔进行分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在postgres中对几个月的日期记录分组后填补时间间隔

如何在 Oracle SQL 上进行查询以获取时间间隔,按特定字段分组

防止日期间隔重叠并与 Oracle +11g 中的触发器保持一致

Oracle - 沿间隔分组值

按日期间隔分组 Oracle

在 Oracle SQL 中按时间间隔聚合数据