2010-02-10 5 views
1

내가 온/오프 상태, 또는 상태가MySQL의 쿼리는 시간 뭔가의 집계 기간을 평가하는

00:00:00 0 
04:00:00 1 
08:00:00 0 
09:00:00 1 
15:00:00 0 
20:00:00 1 
23:59:59 0 
을 "시작"하는 지점을에 나타내는 테이블에 온/오프 데이터에 대한 타임 스탬프의 시리즈가 "에"입니다

24 시간 동안 ON 상태의 총 지속 시간을 계산해야합니다. 이 간단한 예에서는 총 지속

= 1 (04 : 00 : 00-> 8시 0분 0초, 09 : 00 : 00-> 15시 0분 0초, 20 : 00 : 00-> 23 : 59:59 ie 13:59:59 약 14h

이 작업이 SQL에서만 수행 될 수 있는지 또는 기본 프레임 워크 (django)가 반환 된 데이터를 기반으로 수행해야하는지 여부를 결정할 수 없습니다. 우리가 별도의 통계 패키지에서 SQL을 사용해야 할 수도 있기 때문에 가능하다면 데이터베이스를 무겁게하는 것이 더 바람직 할 것입니다.

작업을 수행 할 수 있는지는 분명하지 않습니다. 이전 또는 다음 선택 요소, 나는 자신감을 SQL 사용자가 있지만 이 아이디어 나 일반적인 접근 방식, 아이디어에 대한 시작점을 알 수 없습니까?

나는 이것을 하나의 쿼리 또는 이것을 계산하는 다른 영리한 방법으로 정말 좋아할 것입니다.

+0

첫째, 나는 DESI 것 gn 테이블을 사용하여 ON 및 OFF 상태 시간이 다른 열의 같은 행에 있으면이 작업은 간단합니다. 그게 불가능하다면 해킹을 많이 당하게 될 것입니다. –

답변

1

은 MySQL은 더 row_number() 없습니다,하지만 당신은 두 번 이전 행을 검색하기 위해 가입 할 수 있습니다

MySQL의에서
select 
    sum(case when cur.state = 0 then 0 
     else subtime(cur.timeCol, prev.timeCol) 
     end) as TotalOnTime 
from YourTable cur 
join YourTable prev 
    on prev.timeCol < cur.timeCol 
left join YourTable inbetween 
    on prev.timeCol < inbetween.timeCol 
    and inbetween.timeCol < cur.timeCol 
where inbetween.timeCol is null; 

, 당신은 또한이 경우에는 아마 더 효율적입니다 변수를 사용할 수 있습니다 :

set @total := '00:00:00'; 
set @lasttime := '00:00:00'; 

select 
    @total := addtime(@total, case 
     when state = 0 then 0 
     when @lasttime is null then 0 
     else subtime(timeCol, @lasttime) 
     end) 
, @lasttime := timeCol 
from YourTable 
order by timeCol; 

select 'Result = ', @total; 

코드 생성 및 테스트 테이블을 채우는 : 모든

DROP TABLE IF EXISTS YourTable; 
CREATE TABLE YourTable (
    timeCol time, 
    state bit 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

insert into YourTable values ('00:00:00', 0); 
insert into YourTable values ('04:00:00', 1); 
insert into YourTable values ('08:00:00', 0); 
insert into YourTable values ('09:00:00', 1); 
insert into YourTable values ('15:00:00', 0); 
insert into YourTable values ('20:00:00', 1); 
insert into YourTable values ('23:59:59', 0); 
+0

이 쿼리의 복잡성으로 인해 SQL에서와 같이 코드에서 수행 할 때 이것이 훨씬 더 효율적 일 수 있는지 궁금합니다. 그러나 그것이 효과가있는 것처럼 보입니다. –

+0

변수 예제를 사용하는 곳을 얻었고, 도움을 주신 것에 감사드립니다. @lasttime var 앞에 마침표 (".") 접두어가 익숙하지 않습니다. 어떻게됩니까? 이 구문을 사용하면 오류가 발생하며 설명서에서 의미하는 바를 찾을 수 없습니다. – Aitch

+0

@Aitch : 그 다음 칼럼을 위해서','쉼표를 써야했다. – Andomar