重叠期 - 在连续的时间序列中合并

时间:2014-06-11 08:03:03

标签: sql algorithm sorting oracle11g overlapping

最近我正在处理重叠间隔问题。 我有以下情况:

输入:

我有一个数据库表,其中包含类似的月度数据:

StartDate   |   EndDate   |  Value

31.07.2010  |  31.08.2010 |  4500
31.08.2010  |  30.09.2010 |  6500

一个表包含from - to data这样的数据:

StartDate   | EndDate    |  Value

16.08.2010  | 29.09.2010 |  9500

输出:具有连续期间序列的新表

StartDate   | EndDate    |  Value

31.07.2010  | 15.08.2010 |  4500
16.08.2010  | 29.09.2010 |  9500
30.09.2010  | 30.09.2010 |  6500

你将如何解决这个问题?

我的想法是将两个表联合起来并按startdate对它们进行排序。 确定重叠时期并进行调整。

是否已有可用于此目的的算法?或者有人接近过类似的问题?

谢谢, 帕特里克

1 个答案:

答案 0 :(得分:0)

我认为,一般来说,这个问题可以通过在一个数据集中选择所有可能的开始日期来解决,然后对于每个开始日期,从下一行获取日期作为期间的结束日期,如下所示:

;with cte(StartDate) as (
    select distinct StartDate from Table1
    union
    select distinct EndDate from Table1
    union
    select distinct StartDate from Table2
    union
    select distinct dateadd(dd, 1, EndDate) from Table2
), cte2 as (
    select
        StartDate,
        row_number() over(order by StartDate asc) as rn
    from cte
)
select
    c.StartDate,
    case
        when c2.rn = max(c2.rn) over() then c2.StartDate
        else dateadd(dd, -1, c2.StartDate)
    end as EndDate
from cte2 as c
    inner join cte2 as c2 on c2.rn = c.rn + 1

<强> sql fiddle demo

此代码适用于SQL Server,答案还取决于句点结尾是否可能等于下一个句点的开头,但您可以大致了解。