2017-01-06 6 views
0

階層的なデータを持つ連続する行の時間差をどのようにクエリしますか?例えば、私は、次の表から行きたい:階層的なデータを持つ連続した行のMySQLの時間差

 
+-------+----------+---------------------+ 
| group_id | event |  event_time  | 
+-------+----------+---------------------+ 
|  1 | alarm | 2016-12-01 17:53:12 | 
|  1 | alarm | 2016-12-01 17:59:43 | 
|  2 | purchase | 2016-11-29 09:49:47 | 
|  2 | purchase | 2016-11-29 09:53:51 | 
|  2 | purchase | 2016-11-29 09:57:59 | 
|  2 | alarm | 2016-11-29 10:01:02 | 
|  2 | alarm | 2016-11-29 10:13:27 | 
|  2 | purchase | 2016-11-29 10:15:00 | 
|  2 | purchase | 2016-11-29 10:16:24 | 
+-------+----------+---------------------+ 

へ:

 
+-------+----------+---------------------+------------+ 
| group_id | event |  event_time  | time_delta | 
+-------+----------+---------------------+------------+ 
|  1 | alarm | 2016-12-01 17:53:12 | 0   | 
|  1 | alarm | 2016-12-01 17:59:43 | 00:06:31 | 
|  2 | purchase | 2016-11-29 09:49:47 | 0   | 
|  2 | purchase | 2016-11-29 09:53:51 | 00:04:04 | 
|  2 | purchase | 2016-11-29 09:57:59 | 00:04:08 | 
|  2 | alarm | 2016-11-29 10:01:02 | 0   | 
|  2 | alarm | 2016-11-29 10:13:27 | 00:12:25 | 
|  2 | purchase | 2016-11-29 10:15:00 | 0   | 
|  2 | purchase | 2016-11-29 10:16:24 | 00:01:24 | 
+-------+----------+---------------------+------------+ 

データは、上記の例示であり、私のデータには実際に多くのグループと多くのイベントがあります。ですから、基本的には、group_idとイベントが連続する行で同じである場合は、時間差を計算したいと思います。

+0

試してみましたか? – e4c5

+0

購入アイテムが5つありますどのペアを比較するかをどのように知っていますか? – e4c5

+0

'00:02:08'は' 00:04:08'でなければなりません – GurV

答えて

0

次の操作を行うことによって与えられたグループの前の時間を得ることができます:あなたは、その後のような、さまざまな方法での時間差を取得することができます

select t.*, 
     (select t2.time_delta 
     from t t2 
     where t2.group_id = t.group_id and 
       t2.event = t.event and 
       t2.event_time < t.event_time 
     order by t2.event_time desc 
     limit 1 
     ) as prev_event_time 
from t; 

select t.*, timediff(event_time, prev_event_time) 
from (select t.*, 
      (select t2.time_delta 
       from t t2 
       where t2.group_id = t.group_id and 
        t2.event = t.event and 
        t2.event_time < t.event_time 
       order by t2.event_time desc 
       limit 1 
      ) as prev_event_time 
     from t 
    ) t 
0

が使用して、これを試してみてくださいユーザー定義の変数:

SELECT 
    group_id, event, event_time, diff time_delta 
FROM 
    (SELECT 
     t1.*, 
      CASE 
       WHEN @event = event AND @group = group_id THEN TIME_FORMAT(TIMEDIFF(event_time, @et), '%H:%i:%s') 
       ELSE 0 
      END diff, 
      @event:=event, 
      @group:=group_id, 
      @et:=event_time 
    FROM 
     (SELECT 
     * 
    FROM 
     your_table 
    ORDER BY group_id , event_time) t1 
    CROSS JOIN (SELECT @event:='', @group:=- 1, @et:='') t2) t; 

@et変数店舗EAC内で、前のEVENT_TIME h group_idとeventのグループ。

関連する問題