2015-01-23 1 views
0

다음과 같은 문제를 해결하기 위해 머리를 아프게했습니다. 식별자, 특성 및 시작 날짜와 종료 날짜가있는 테이블이 있습니다. 일반적으로 간격의 끝에서 특성이 변경되어야합니다. 그러나 시스템의 결함으로 인해 동일한 특성으로 순차적 간격이 만들어집니다. 예 :동일한 ID (Sybase IQ)의 간격 수를 최소화하십시오.

 
    ID Characteristic Start Date End Date 
    1 a    2012/06/25 2012/12/11 
    1 a    2012/12/11 2013/06/24 
    1 b    2013/06/24 2013/11/27 
    1 a    2013/11/27 2013/12/10 
    1 a    2013/12/10 2014/01/21 
    1 a    2014/01/21 2014/06/15 
    1 c    2014/06/15 2014/09/10 
    1 c    2014/09/11 2999/12/31 

나는 ID & 특성 그룹당 최대 (종료 날짜)를 참조하고 싶습니다. 그러나 그룹은 연속적인 시간 프레임 내에 그룹으로 남아 있어야합니다. 뭔가 같이 :

ID Characteristic Start Date End Date 
1 a    2012/06/25 2013/06/24 
1 b    2013/06/24 2013/11/27 
1 a    2013/11/27 2014/06/15 
1 c    2014/06/15 2999/12/31 

나는 FIRST_VALUE, LEADLAG와 장난 봤는데하지만 난 그것을 알아낼 수 없습니다.

+0

SQL Server 2012를 사용하고 계십니까? –

+0

Sybase IQ - 레이아웃 주셔서 감사합니다. – stedes

+0

수행하려는 작업을 이해하지 못합니다. 예상 결과 뒤에 나오는 논리는 무엇입니까? – Kritner

답변

0

이것이 최선의 방법은 아닌지 잘 모르겠지만 위에서 제시 한 데이터 샘플에서 작동합니다. #tmp라는 테이블에 값을 삽입 했으므로 테이블 이름으로 바꿔야합니다. 또한 필요에 따라 StartDate 및 EndDate 열 이름을 바꿉니다.

SELECT ID, Characteristic, MinStartDate, MaxEndDate 
    FROM ( 
    SELECT 
     ID, 
     Characteristic, 
     ISNULL(
      (SELECT MAX(B.EndDate) FROM (SELECT ROW_NUMBER() OVER (ORDER BY StartDate) AS 'Row', * FROM #tmp) AS B WHERE B.Characteristic <> A.Characteristic AND B.Row < A.Row) 
     , 
      (SELECT MIN(B.StartDate) FROM (SELECT ROW_NUMBER() OVER (ORDER BY StartDate) AS 'Row', * FROM #tmp) AS B WHERE B.Characteristic = A.Characteristic AND B.Row <= A.Row) 
     ) AS 'MinStartDate', 
     ISNULL(
      (SELECT MIN(B.StartDate) FROM (SELECT ROW_NUMBER() OVER (ORDER BY StartDate) AS 'Row', * FROM #tmp) AS B WHERE B.Characteristic <> A.Characteristic AND B.Row > A.Row) 
     , 
      (SELECT MAX(B.EndDate) FROM (SELECT ROW_NUMBER() OVER (ORDER BY StartDate) AS 'Row', * FROM #tmp) AS B WHERE B.Characteristic = A.Characteristic AND B.Row >= A.Row) 
     ) AS 'MaxEndDate' 
    FROM 
    (SELECT ROW_NUMBER() OVER (ORDER BY StartDate) AS 'Row', * FROM #tmp) as A 
    ) AS Sub 
GROUP BY ID, Characteristic, MinStartDate, MaxEndDate 
ORDER BY MinStartDate 
+0

이것이 작동하지 않습니다. "집계 함수의 사용이 잘못되었습니다." – stedes

+0

죄송합니다. Sybase에 기사가 업데이트되기 전에 SQL Server 용으로 작성했습니다. 위의 약간의 수정을 시도해보십시오. 작동하지 않는 경우 응답을 중단합니다. – aaroncatlin

+0

작동하지 않습니다. 같은 오류입니다. 그러나 어쨌든 고마워. 또한 사례를 개선하여 사례를보다 잘 다루도록하겠습니다. – stedes