2017-06-14 19 views
-2

表1:條件行以單行的MySQL

event    | time      |id   | user 
    --------------------------------------------------------------------- 
    ADDMEMBER   | 2017-06-14 08:03:58.872908 | 2335797 | x  
    REMOVEMEMBER  | 2017-06-14 09:17:02.719318 | 2337422 | x 
    ADDMEMBER   | 2017-06-14 09:28:23.343281 | 2337737 | x 
    REMOVEMEMBER  | 2017-06-14 09:46:50.189582 | 2338117 | x 

我所需的輸出是每個使用addMember組和REMOVEMBER 1行:

event    | Login      | Logoff      |user 
    --------------------------------------------------------------------------------------- 
    ADDMEMBER   | 2017-06-14 08:03:58.872908 | 2017-06-14 09:17:02.719318 | x  
    ADDMEMBER   | 2017-06-14 09:28:23.343281 | 2017-06-14 09:46:50.189582 | x  

我不知道如何做到這一點。任何幫助將不勝感激。

+2

你能告訴我們,你試過SQL以及它給出的結果? – SaggingRufus

+0

請描述你如何將addmember和removemembers相互配對。數據中沒有會話標識符,只有用戶標識。如果只能使用用戶和時間信息,那麼是否可以在沒有removemember事件的情況下結束會話? – Shadow

回答

0

假設ADDMEMBERREMOVEMEMBER事件總是配對,那麼你可以使用下面的查詢來獲取LoginLogoff時間:

SELECT 'ADDMEMBER', 
     MIN(`time`) AS Login, 
     MAX(`time`) AS Logoff, 
     user 
FROM (    
    SELECT event, `time`, id, user, 
      @grp := IF(event = 'ADDMEMBER', @grp + 1, @grp) AS grp     
    FROM mytable 
    CROSS JOIN (SELECT @grp := 0) AS v 
    ORDER BY `user`, `time`) AS t 
GROUP BY user, grp; 

Demo here