Вы не указываете, что делать, если подряд два «сбоя». Если вы всегда знаете, что следующая строка является восстановлением, тогда:
SELECT imei, TIMESTAMP_DIFF(next_time, time, MILLISECOND) as time_diff_in_milliseconds
FROM (SELECT t.*,
LEAD(time) OVER (PARTITION BY imei ORDER BY time) as next_time
FROM t
)
WHERE event_type = 'failure';
Если нет, то также проверьте следующий тип события:
SELECT imei, TIMESTAMP_DIFF(next_time, time, MILLISECOND) as time_diff_in_milliseconds
FROM (SELECT t.*,
LEAD(time) OVER (PARTITION BY imei ORDER BY time) as next_time,
LEAD(event_type) OVER (PARTITION BY imei ORDER BY time) as next_event_type
FROM t
)
WHERE event_type = 'failure' and next_event_type = 'failure-restored';