Pavel> It is relative hard to it now with SQL only.
Only relatively. My standard solution is something like this:
select start_time, reason, sum(km) as km from (select max(label_time) over (order by start) as start_time, reason, km from (select start, reason, km, case when reason is distinct from lag(reason) over (order by start) then start end as label_time from yourtable ) s2 ) s1 group by start_time, reason order by start_time;
(Your change_number idea is essentially equivalent to doing sum(case when x is distinct from lag(x) over w then 1 end) over w, except that since window functions can't be nested, that expression requires a subquery.)
yes, I found this solution in third iteration too.