2016-09-08 8 views
2

ユーザーのイベントを追跡するテーブルがある場合。2つのイベント間の時間

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 

clearアクションが続く場合がありますcreateアクションは常にあります。

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

は今、私は、ユーザーのcreateclear間time_diffを取得するために、これら二つのアクション間の時間差を照会します。

今のところuserに複数のエントリがないと仮定できます(たとえば、少なくとも1つはcreate、最大値はclear)。

私はこのような結果を持っているしたいと思います:

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

答えて

1

あなたは、次のクエリを使用することができます。

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 

HAVING句フィルタアウト記録のようなだけcreateアクションを含むuser_idグループを、 OPの中にid=9がある。

Demo here

+0

ありがとうございます。これは素晴らしい作品で、私が探していたものです。私が理解していないことの1つは、なぜMAX()が必要なのかです。 – Mark

+1

'GROUP BY'のために@Mark' MAX() 'が必要です。' GROUP BY'節に含まれていない 'SELECT'節のフィールドはすべて、集約関数内で使用する必要があります。 –

+0

ありがとう、知っておいてよかった!私はこの問題を最後の数回静かにしました。今私はこれを熱望する方法を知っています - 素晴らしい!!! – Mark

関連する問題