Cách dễ nhất để tiếp cận điều này là sử dụng các biến và tôi nghĩ rằng cách tiếp cận dễ nhất là thêm hai biến, một là số "lên" và một là số "xuống" vào bất kỳ hàng nhất định nào. Một dãy số tăng nhất định có giá trị không đổi đối với số chữ "xuống" trước đó và ngược lại. Logic này có thể được sử dụng để tổng hợp.
Truy vấn kết quả là:
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);