2014-06-11 5 views
1

최근 겹치는 간격 문제를 다루고 있습니다. 나는 다음과 같은 상황이 있습니다겹치는 기간 - 연속적인 시계열에서 병합

입력 :

나는이 같은 월별 데이터를 포함하는 하나 개의 DB 테이블 :

StartDate | EndDate | Value 

31.07.2010 | 31.08.2010 | 4500 
31.08.2010 | 30.09.2010 | 6500 

그리고에서 포함하는 하나 개의 테이블 - 같은 데이터 :

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

dba.stackexchange로 마이그레이션 하시겠습니까? 어떤 서버 태그입니까? –

답변

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 용이며, 가능하다면 대답도에 따라 다릅니다 기간의 끝은 다음 기간의 시작과 같거나 같지 않겠지 만 일반적인 생각을 얻을 수 있습니다.

+0

@pamaxeed no prob, CTE가있는이 코드는 매우 빠르지 않을 수 있습니다. 임시 테이블을 사용하여 날짜를 저장할 수 있습니다. –

+0

안녕 로마, 대답 주셔서 감사합니다, 그것은 나를 위해 매우 도움이됩니다. UR 방법을 이해하기 위해서 : 임시 데이터 세트를 작성하십시오 (cte는 트랜잭션 sql 키워드라고 생각합니다). 모든 StartDate를 저장하고 오름차순으로 정렬합니다. 그리고 나서 각각의 시작일에 대해 다음 행의 시작일을 검색하여 종료일로 만듭니다. 맞아? 왜 Table2에서 select dateadd (dd, 1, EndDate)를 추가할까요? 그리고 그 결과 값이 누락되었습니다. – pamaxeed

관련 문제