इस तक पहुंचने का सबसे आसान तरीका चर का उपयोग कर रहा है और मुझे लगता है कि सबसे आसान तरीका दो चर जोड़ना है, एक "अप" की संख्या और दूसरी किसी भी पंक्ति में "डाउन" की संख्या। अप के दिए गए अनुक्रम में पूर्ववर्ती "डाउन" की संख्या के लिए एक स्थिर मान होता है, और इसके विपरीत। इस तर्क का उपयोग एकत्रीकरण के लिए किया जा सकता है।
परिणामी क्वेरी है:
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);