2014-09-21 17:51 GMT+02:00 Andrew Gierth <and...@tao11.riddles.org.uk>:

> >>>>> "Pavel" == Pavel Stehule <pavel.steh...@gmail.com> writes:
>
>  Pavel> Hi
>  Pavel> I tried to solve following task:
>
>  Pavel> I have a table
>
>  Pavel> start, reason, km
>  Pavel> =============
>  Pavel>  2014-01-01 08:00:00, private, 10
>  Pavel>  2014-01-01 09:00:00, commerc, 20
>  Pavel>  2014-01-01 10:00:00, commerc, 20
>  Pavel>  2014-01-01 11:00:00, private, 8
>
>  Pavel> and I would reduce these rows to
>
>  Pavel>  2014-01-01 08:00:00, private, 10
>  Pavel>  2014-01-01 09:00:00, commerc, 20 + 20 = 40
>  Pavel>  2014-01-01 11:00:00, private, 8
>
>  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.

so this proposal lost a main benefit

Regards

Pavel


> --
> Andrew (irc:RhodiumToad)
>

Reply via email to