Вы, похоже, заинтересованы в получении обеих строк, если они находятся на расстоянии 20 минут.Следующие попытки эмулируют LEAD и LAG:
SELECT * FROM (
SELECT *, (
SELECT CASE WHEN EVENT = 'LOGOUT' AND main.Event = 'LOGIN' THEN TimeDIFF(main.Time, Time) END
FROM t AS prev
WHERE User = main.User AND Time < main.Time
ORDER BY Time DESC
LIMIT 1
) AS diff_lag, (
SELECT CASE WHEN EVENT = 'LOGIN' AND main.Event = 'LOGOUT' THEN TimeDIFF(Time, main.Time) END
FROM t AS next
WHERE User = main.User AND Time > main.Time
ORDER BY Time ASC
LIMIT 1
) AS diff_lead
FROM t AS main
) x
WHERE diff_lag > '00:20:00' OR diff_lead > '00:20:00'
В качестве альтернативы попробуйте следующий подход, который, кажется, работает, за исключением того, что он объединяет обе строки:
SELECT *
FROM t AS o
INNER JOIN t AS i ON o.User = i.User AND o.Time < i.Time -- join logouts with potential logins
LEFT JOIN t AS x ON o.User = x.User AND o.Time < x.Time AND x.Time < i.Time -- any row present between logout and login
WHERE o.Event = 'LOGOUT' AND i.Event = 'LOGIN' AND x.ID IS NULL AND TIMEDIFF(i.Time, o.Time) > '00:20:00'