2013-01-11 2 views
5

나는 MS SQL Server에서 아래와 유사한 테이블을 가지고 있습니다.최소 및 최대 ID 및 그룹 및 기타 조건보다

 id | Timestamp | active 
    -----+-----------+-------- 
     1 | 1:00 | 1 
     1 | 2:00 | 1 
     1 | 3:00 | 1 
     1 | 4:00 | 0 
     1 | 5:00 | 0 
     1 | 6:00 | 1 
     1 | 7:00 | 0 
     1 | 8:00 | 0 
     1 | 9:00 | 0 
     1 | 10:00 | 1 
     1 | 11:00 | 1 
     1 | 12:00 | 0 
     1 | 13:00 | 1 
     2 | 2:00 | 1 
     2 | 3:00 | 1 
     2 | 4:00 | 0 
     2 | 5:00 | 0 
     3 | 8:00 | 0 
     3 | 9:00 | 0 
     4 | 1:00 | 1 
     4 | 2:00 | 1 
     5 | 16:00 | 0 

각 ID가 비활성 상태 (활성 = 0) 인 시간을 확인하고 싶습니다. 내가 시도한 것은 ID = 0 일 때 id로 그룹화하고 최소 및 최대 시간에 대한 datediff를 수행하는 것입니다. 하지만 그것은 id 1이 8 시간 (12:00 - 4:00) @ 12:00 동안 오프라인이라고 말한 결과를 나에게 줄 것입니다. 정말 원할 때 다음 결과 집합을 제공하는 쿼리가 필요합니다.

id | approx. offline in hours | at time 
    ---+--------------------------+----------- 
    1 |   1    | 5:00 
    1 |   2    | 9:00 
    1 |   0    | 12:00 
    2 |   1    | 5:00 
    3 |   0    | 9:00 
    5 |   0    | 16:00 

내가 처음 시도 잘못된 쿼리

SELECT id as [Inactive], 
     DATEDIFF(hour, MIN(Timestamp), MAX(Timestamp)) as [approx. offline in hours], 
     MAX(Timestamp) as [at time] 
FROM table 
WHERE active = 0 
GROUP BY [Inactive] 

입니다 그러나 쿼리의 문제는 그 사이에 활성 시간을 건너 뛰고 있다는 것입니다. 나는 THIS의 질문을했고 PARTITION을 사용하여 대답했지만 질문이 너무 다르고 대답이 너무 구체적이어서 이해할 수없는 것처럼 보였다.

도움을 주시면 감사하겠습니다.

+0

어떤 rdbms를 사용하고 있습니까? SQL 서버, 오라클? – Taryn

+0

@bluefeet 대괄호 대괄호 == SQL Server –

+0

@JoachimIsaksson 동의하지만 그들은 사용하는 rdbms를 명시해야합니다. – Taryn

답변

3

이 방법에 접근하는 한 가지 방법은 모든 데이터베이스에서 작동하며 상관 하위 쿼리를 사용하는 것입니다. 각 활성 값 문자열에 그룹 이름을 할당하는 것이 좋습니다. 특정 그룹 이름은 다음 번 값 변경 시간입니다.

select id, active, min(TimeStamp), max(TimeStamp) 
from (select t.*, 
      (select min(timeStamp) from t t2 where t2.id = t.id and t2.timeStamp > t.timeStamp and t2.active <> t.active 
      ) groupName 
     from t 
    ) t 
group by id, groupName, active 

한 당신이 기간에 타임 스탬프를 설정 얼마나주의 사항이 데이터베이스에 따라 달라집니다. 데이터베이스를 지정하지 않으므로이 논리를 추가 할 것입니다.

또한 주어진 id에 대한 마지막 레코드가 비활성 인 경우 그룹 이름은 NULL입니다. 그것은 문제가되지 않습니다.

+0

ID가 바뀌면 groupName이 NULL이 될 것이므로이 대답에는 버그가 있다고 생각합니다. – Bulat

+0

@Bulat. . . 그것은 문제가되지 않습니다. 그룹화에 NULL이 유효하며 id는'group by '열에 포함됩니다. –

+0

네, 맞습니다. 문제 없습니다. 필드 이름의 일관성을 유지하기 위해 TimesStamp의 이름을 바꿀 수 있습니다. http://sqlfiddle.com/#!3/e5831/45/0 – Bulat