2011-10-14 3 views
1

장치의 문제 해결 이벤트를 나타내는 일련의 레코드가 MySQL에 있습니다. 어떤 장치가 주어진 시간 범위 내에서 연속적인 문제 해결 이벤트를 갖는지 찾는 데 흥미 롭습니다.데이터베이스에서 시간 범위 내에서 반복되는 레코드 찾기

예를 들어 서로 다른 5 일 이내에 두 개 이상의 문제 해결 이벤트가 발생했는지 알고 싶지만 모든 장치를 나열하도록 쿼리를 구성하는 방법을 모르겠습니다. 이 샘플 데이터로

devices 
----- 
id name 

events 
----- 
id device_id datetime 

:

device_id event_id datetime 
1   2   2011-06-15 
1   4   2011-06-18 
2   3   2011-06-18 
2   5   2011-06-20 
:

events 
----- 
id device_id datetime 
--- ---   --- 
1  1   2011-01-01 
2  1   2011-06-15 
3  2   2011-06-18 
4  1   2011-06-18 
5  2   2011-06-20 

내가 같은 결과를 제공하는 쿼리를 생성하고자하는

나는 이와 비슷한 두 개의 테이블이

2011-01-01의 이벤트는 5 일 이상 분리되어 있으므로 생략해야합니다.

나는이 접근 방법에 대한 조언을 주시면 감사하겠습니다.

+1

관련 질문이지만 일정 범위의 이벤트가있는 이벤트 : [기간 JYelton

답변

0

여기 WAG입니다. 대신 갖는

select 
    device_id, 
    event_id, 
    datetime 
from 
    events 
where 
    device_id in 
(
    select 
    device_id 
    from 
    (
    select 
     device_id, 
     count(device_id) event_count 
    from 
     events 
    group by 
     device_id 
    having 
     event_count > 1 
) 
) 
order by 
    device_id, 
    event_id, 
    datetime 

가능 where event_count > 1 .

날짜 범위의 경우 범위 내부 검사 (count()가있는 쿼리)에 범위 검사를 추가하십시오. 예를 들어

추가, (다른 답변에서 냈다) :이 마지막 오일 withi 이벤트를 가지고 모든 장치를 찾아 낼 것입니다 WHERE events.datetime BETWEEN DATE_SUB(CURDATE(), INTERVAL 5 DAY) AND CURDATE()

+0

날짜 범위와 어떤 관련이 있습니까? 요구 사항? – JYelton

0
SELECT devices.`device_id`, events.`id` AS event_id, events.`datetime` 
FROM devices 
INNER JOIN events ON events.`id` = devices.`id` 
WHERE events.`datetime` BETWEEN DATE_SUB(CURDATE(), INTERVAL 5 DAY) AND CURDATE() 
ORDER BY devices.`device_id` ASC 

. CURDATE()을 시작일로 바꿀 수 있습니다.

+0

이것은 날짜 범위의 모든 이벤트를 나열하지만 * repeat * 이벤트에 관심이 있습니다. 날짜 범위 내의 장치에 대한 단일 이벤트는 생략해야합니다. – JYelton

관련 문제