2012-09-27 2 views
0

쿼리에 문제가 있습니다. I는 고유 값을 추출해야예외가있는 Tsql group by 절

Data 
    ID Value Timestamp 
    1 0  2001-1-1 
    2 0  2002-1-1 
    3 1  2003-1-1 
    4 1  2004-1-1 
    5 0  2005-1-1 
    6 2  2006-1-1 
    7 2  2007-1-1 
    8 2  2008-1-1 

및 최신의 제 occurance :

데이터 (타임 스탬프 순서)이다. 여기서 예외는 해당 시간대에 새 값으로 중단되지 않은 경우에만 그룹화해야한다는 것입니다. 그래서 내가 필요한 데이터는 다음과 같습니다 나는 복잡한 쿼리에 의해이 작품을 만들었지 만, 그것을 할 수있는 쉬운 방법, 그것은 단지 캔트 생각이 확신 한

ID Value Timestamp 
1 0  2001-1-1 
3 1  2003-1-1 
5 0  2005-1-1 
6 2  2006-1-1 

. 아무도 도와 줄 수 있습니까?

이것은 내가 시작한 것입니다. 아마도 그렇게 할 수있을 것입니다. 이것은 값이 변경 될 때 찾아야하는 쿼리입니다.

> SELECT * FROM Data d1 join Data d2 ON d1.Timestamp < d2.Timestamp and 
    > d1.Value <> d2.Value 

아마도 row_number 절을 잘 사용할 수는 있지만 관리 할 수 ​​없습니다.

+0

쿼리를 표시하십시오. 개선을 위해 최선을 다할 것입니다. – stb

+0

어떤 SQL Server 버전입니까? 2012 버전에는 2005 또는 2000 버전의 옵션이 아닌 방법이 있습니다. –

답변

0

샘플 데이터 :

declare @T table (ID int, Value int, Timestamp date) 
insert into @T(ID, Value, Timestamp) values 
(1, 0,  '20010101'), 
(2, 0,  '20020101'), 
(3, 1,  '20030101'), 
(4, 1,  '20040101'), 
(5, 0,  '20050101'), 
(6, 2,  '20060101'), 
(7, 2,  '20070101'), 
(8, 2,  '20080101') 

검색어 :

;With OrderedValues as (
    select *,ROW_NUMBER() OVER (ORDER By TimeStamp) as rn --TODO - specific columns better than * 
    from @T 
), Firsts as (
    select 
     ov1.* --TODO - specific columns better than * 
    from 
     OrderedValues ov1 
      left join 
     OrderedValues ov2 
      on 
       ov1.Value = ov2.Value and 
       ov1.rn = ov2.rn + 1 
    where 
     ov2.ID is null 
) 
select * --TODO - specific columns better than * 
from Firsts 

내가 순차적하고없는 틈을되는 ID 값에 의존하지 않았다. 이 경우 테이블 및 rn 대신 ID을 사용하고 OrderedValues을 생략 할 수 있습니다. 두 번째 쿼리는 단순히 바로 앞의 행이없는 행을 찾고 Value과 같습니다.

결과 :이 특정 순서로 결과를 필요로하는 경우

ID   Value  Timestamp rn 
----------- ----------- ---------- -------------------- 
1   0   2001-01-01 1 
3   1   2003-01-01 3 
5   0   2005-01-01 5 
6   2   2006-01-01 6 

당신은 rn으로 주문할 수 있습니다.

+0

감사합니다. Damien! 완벽하게 일했습니다! – informerica