Puoi farlo con un join sinistro e poi sottrarre le 2 date:
select
t.id,
t.action_date login_date, tt.action_date logout_date,
t.user_id,
(tt.action_date - t.action_date) / 100 session_time
from (
select * from session where status = 'LOGIN'
) t left join (
select * from session where status = 'LOGOUT'
) tt on tt.user_id = t.user_id and
tt.action_date = (
select min(action_date) from session
where status = 'LOGOUT' and user_id = t.user_id and action_date > t.action_date
)
Guarda la demo
.
Risultati:
| id | login_date | user_id | logout_date | session_time |
| --- | ------------------- | ------- | ------------------- | ------------ |
| 1 | 2019-07-16 07:06:55 | Bob | 2019-07-16 07:29:13 | 22.58 |
| 3 | 2019-07-16 07:30:31 | Bob | 2019-07-16 07:49:50 | 19.19 |
| 5 | 2019-07-16 08:05:55 | Tom | 2019-07-16 08:15:13 | 9.58 |
| 7 | 2019-07-16 09:13:55 | John | 2019-07-16 09:20:13 | 6.58 |