Cara termudah untuk mendekati ini adalah menggunakan variabel dan saya pikir pendekatan termudah adalah dengan menambahkan dua variabel, satu jumlah "naik" dan yang lainnya jumlah "turun" hingga baris tertentu. Urutan naik tertentu memiliki nilai konstan untuk jumlah "turun" sebelumnya, dan sebaliknya. Logika ini dapat digunakan untuk agregasi.
Kueri yang dihasilkan adalah:
select result, min(time_stamp) as start_time, max(time_stamp) as end_time
from (select r.*,
(@ups := @ups + (result = 'up')) as ups,
(@downs := @downs + (result = 'down')) as downs
from results r cross join
(select @ups := 0, @downs := 0) vars
where service_id = 1
order by time_stamp
) r
group by result, (case when result = 'up' then downs else ups end);