最近我正在处理重叠间隔问题。 我有以下情况:
输入:
我有一个数据库表,其中包含类似的月度数据:
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对它们进行排序。 确定重叠时期并进行调整。
是否已有可用于此目的的算法?或者有人接近过类似的问题?
谢谢, 帕特里克
答案 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,答案还取决于句点结尾是否可能等于下一个句点的开头,但您可以大致了解。