2017-04-05 4 views
1

나는 이러한 값으로 테이블 XYZ가,이 문제가 사이의 시간 차이 :MySQL의 : 가장 가까운 행

PRODUCT_ID, USER_NAME, EVENT_TYPE, EVENT_TIME

ABCD123, 사용자 1, 수리, 2017년 1월 16일 14시 51분 28초

ABCD123, USER1, REPAIR는 2017년 1월 16일 15시 51분 28초

ABCD123, USER1, 수리 완료 2017년 1월 16일 16시 51분 28초

ABCD123, user1, 수리 완료, 2017-01-16 18:51:28

첫 번째 수리 완료와 첫 번째 수리 및 두 번째 수리 완료와 두 번째 수리 사이의 시간차는 어떻게됩니까?

select a.product_id, a.user_name, b.event_time as start_time, a.event_time as end_time, FORMAT((TIMESTAMPDIFF(SECOND, b.event_time, a.event_time)/3600),2) as difference 
FROM XYZ a 
join XYZ b 
ON a.product_id = b.product_id and a.user_name = b.user_name and a.event_type = 'REPAIR DONE' and b.event_type = 'REPAIR' 
group by a.product_id, a.user_name 
order by a.event_time asc 

그러나 어떤 이유에서 결과가 이것이다

: 는 I이 시도

ABCD123, USER1, 차가 1 HOUR

ABCD123, USER1, 차분 4 HOURS

것이 올바른 :

ABCD123, user1, difference 1 HOUR

ABCD123, user1, difference 2 HOURS

즉, 두 번째 행에서 두 번째 REPAIR과 두 번째 REPAIR DONE 대신 두 번째 REPAIR과 두 번째 REPAIR DONE 사이의 차이점이 나타납니다.

아무에게도 조언 해 줄 수 있습니까?

답변

0

당신은 내 이해에 따라 적절한 출력을 보여줍니다이 쿼리

select r.*, ROUND((TIMESTAMPDIFF(HOUR,r.event_time,rd.event_time))) as time_t 
from ((select * from xyz where event_event_type='REPAIR') as r 
JOIN (select * from xyz where event_type='REPAIR DONE') as rd 
ON(rd.event_time >r.event_time)) group by 
r.product_id,r.user_name,r.event_type,r.event_time having MIN(rd.event_time) 

을 시도 this_

SELECT x1.products_id, 
    x1.user_name, 
    CONCAT('difference ', HOUR(x2.event_time - x1.event_time),' Hour') 
    FROM xyz x1 
    LEFT JOIN xyz x2 ON x1.event_time < x2.event_time AND x2.event_type = 'REPAIR DONE' 
    WHERE x1.event_type = 'REPAIR' 
    ORDER BY x1.event_time; 
+0

죄송합니다. 솔루션을 작동시키지 못했지만 문제가 될 수 있습니다. – Raymond

+0

http://sqlfiddle.com/에 몇 가지 샘플 데이터가있는 테이블을 게시 할 수 있습니까? 내가 확인해 보겠습니다. –

+0

안녕하세요, 전자 메일을 통해 샘플 데이터를 보내 주셨습니다. sqlfiddle은 나를 처음 보았을 때 다소 혼란스러워했습니다. 미안 해요. 시도해 주셔서 감사합니다. – Raymond

0

같은 쿼리를 사용할 수 있습니다. 당신의 문제는 저에게 흥미로워 보이기 때문에, 퍼포먼스마다 제 제안 된 솔루션이 좋지 않다는 것을 확신 할지라도, 시도해 봅니다.하지만 첫 번째 시도에서 볼 때, 이것만으로도 충분히 생각할 수 있습니다. 전체 쿼리를 더 잘 수행 할 수 있습니다.

+0

Abhisek, 대단히 감사합니다! 귀하의 솔루션이 실제로 작동합니다. 모든 레코드가있는 테이블에서 중복에 대한 몇 가지 문제점을 만났지 만, 어떻게 든 해결하려고 노력할 것입니다. – Raymond

+0

미안하지만 물론 내 실수였습니다. 모든 기록으로 ON (rd.event_time> r.event_time 및 r.product_id = rd.product_id)과 같이 on을 변경해야합니다. – Raymond

+0

@Raymond 그래서 내 대답이 문제의 해결책이라는 것을 의미합니다. –