Это типичная проблема пробелов и островков, когда вы собираетесь группировать последовательные строки, имеющие одно и то же состояние.
Вот один из способов решения этой проблемы с использованием разницы между номерами строк.
select
equipment_id,
min(timestamp) event_start,
max(timestamp) event_stop,
machine_state_id,
max(reason_id) reason_id
from (
select
t.*,
row_number() over(partition by equipment_id order by timestamp) rn1,
row_number() over(partition by equipment_id, machine_state_id order by timestamp) rn2
from mytable t
) t
group by equipment_id, machine_state_id, rn1 - rn2
order by equipment_id, event_start