2017-04-05 4 views
1

Ich habe dieses Problem, ich habe Tabelle XYZ mit diesen Werten:MySql: Differenz der Zeiten zwischen engstenen Reihen

product_id, user_name, event_type, event_time

ABCD123, user1, REPAIR, 2017.01.16 14:51:28

ABCD123, user1 INSTANDSETZUNGS DONE 2017-01-16 15:51:28

ABCD123, user1 INSTANDSETZUNGS 2017-01-16 16:51:28

ABCD123, Benutzer1, REPARATUR FERTIG, 2017-01-16 18:51:28

Wie wäre es möglich, den Zeitunterschied zwischen der ersten REPAIR DONE und der ersten REPAIR FONE und der zweiten REPAIR DONE und der zweiten REPAIR zu erhalten? Ich versuchte dies:

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 

aber aus irgendeinem Grund das Ergebnis ist folgendes:

ABCD123, user1, differenz 1 Stunde

ABCD123, user1, differenz 4 STUNDEN

korrekt wäre, :

ABCD123, user1, differenz 1 STUNDE

ABCD123, benutzer1, differenz 2 STUNDET

Mit anderen Worten, in der zweiten Reihe I Ergebnis der Differenz zwischen dem ersten Reparatur erhalten und zweiter Reparatur DONE DONE statt zweite Reparatur und zweite Reparatur.

Kann mir bitte jemand einen Rat geben?

Antwort

0

können Sie eine Abfrage wie 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

Es tut mir leid, ich konnte Ihre Lösung nicht zum Laufen bringen, aber es könnte ein Problem auf meiner Seite sein. – Raymond

+0

können Sie eine Tabelle mit einigen Beispieldaten auf http://sqlfiddle.com/ die ich werde es überprüfen –

+0

Hallo, schickte ich Ihnen Beispieldaten per E-Mail, schien sqlfiddle für mich etwas verwirrend auf den ersten Blick. Es tut mir leid. Danke für deinen Versuch. – Raymond

0

Diese Abfrage

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) 

es zeigt eine korrekte Ausgabe gemäß meinem Verständnis verwenden. Da dein Problem für mich interessant aussieht, versuche ich es deshalb, obwohl ich mir ziemlich sicher bin, dass meine gelieferte Lösung nicht sehr performant ist. Aber auf Anhieb ist das die Ausgabe, darüber kannst du nachdenken und kann die gesamte Abfrage besser machen.

+0

Vielen Dank, Abhisek! Ihre Lösung funktioniert wirklich. In der Tabelle mit allen Aufzeichnungen stieß ich auf ein Problem mit Duplikaten, aber das werde ich versuchen, irgendwie zu lösen. – Raymond

+0

Sorry, es war natürlich mein Fehler. Bei allen Aufzeichnungen muss ich die Ursache ändern wie ON (rd.event_time> r.event_time und r.product_id = rd.product_id) – Raymond

+0

@Raymond also meinst du, dass meine Antwort die Lösung für dein Problem ist –

Verwandte Themen