2016-09-08 4 views
2

Wenn eine Tabelle vorhanden ist, die einige Ereignisse eines Benutzers verfolgt.Zeit zwischen zwei Ereignissen

id | user_id | action |   created_at   
----+---------+--------+---------------------------- 
    5 |  1 | create | 2016-09-08 11:29:56.325691 
    6 |  1 | clear | 2016-09-08 11:30:00.08604 
    7 |  2 | create | 2016-09-08 11:30:10.12857 
    8 |  2 | clear | 2016-09-08 11:30:14.238685 
    9 |  3 | create | 2016-09-08 11:30:42.192843 

Es gibt immer eine create Aktion, die von einer clear Taten folgen könnte.

CREATE TYPE user_actions AS ENUM ('create', 'clear'); 

Jetzt möchte ich den Zeitunterschied zwischen diesen beiden Aktionen abzufragen, um die time_diff zwischen dem create und clear eines Benutzers zu erhalten.

Für jetzt können Sie davon ausgehen, dass die user nicht mehrere Einträge (z. B. mindestens eine create und maximal eine weitere clear) hat.

Ich möchte ein Ergebnis wie dieses haben:

user_id | time_diff  
---------+----------------- 
     1 | 00:00:03.760349 
     2 | 00:00:04.110115 

Antwort

1

Sie die folgende Abfrage verwenden:

SELECT user_id, 
     MAX(CASE WHEN action = 'clear' THEN created_at END) - 
     MAX(CASE WHEN action = 'create' THEN created_at END) AS time_diff 
FROM mytable 
GROUP BY user_id 
HAVING COUNT(*) = 2 

Die HAVING Klausel filtert user_id Gruppen nur eine create Aktion, wie Datensatz enthält mit id=9 im OP.

Demo here

+0

Vielen Dank. Das funktioniert großartig und genau das, wonach ich gesucht habe. Eine Sache, die ich nicht verstehe, ist, warum ich die 'MAX()' brauche. – Mark

+1

@Mark 'MAX()' wird benötigt wegen der 'GROUP BY': jedes Feld der' SELECT'-Klausel, das nicht in der 'GROUP BY'-Klausel enthalten ist, muss innerhalb einer Aggregatfunktion verwendet werden. –

+0

Danke, das ist gut zu wissen! Ich hatte dieses Problem einige Male in den letzten Tagen. Jetzt weiß ich, wie man das begehrt - großartig !!! – Mark

Verwandte Themen