Это приложение для оконных функций (называемых аналитическими функциями в Oracle).
Ваша цель - назначить «номер блока» каждой последовательности остановок. То есть все остановки в последовательности (для транспортного средства) будут иметь одинаковый номер блока, и это будет отличаться от всех других последовательностей остановок.
Вот способ присвоить номер блока:
- Создайте флаг скорости, который говорит 1, когда скорость> 0, и 0, когда скорость = 0.
- Перечислите все записи, где флаг скорости = 1. Это «блоки».
- Выполните самостоятельное объединение, чтобы установить каждый флаг = 0 в блоке (для этого требуется группировка и получение максимального числа блоков).
- Суммируйте по продолжительности или как хотите.
Следующий код представляет собой набросок того, что я имею в виду. Это не решит вашу проблему, потому что вы не знаете, как обрабатывать дневные перерывы, какую информацию вы хотите обобщить, и у нее есть ошибка off-by-1 (в каждой последовательности остановок она включает предыдущий безостановочный , если есть).
with vd as
(
select vd.*,
(case when SpeedFlag = 1
then ROW_NUMBER() over (partition by id, SpeedFlag) end) as blocknum
from
(
select vd.*, (case when speed = 0 then 0 else 1 end) as SpeedFlag
from vehicaldata vd
) vd
)
select id, blocknum, COUNT(*) as numrecs, SUM(duration) as duration
from
(
select vd.id, vd.rtime, vd.duration, MAX(vdprev.blocknum) as blocknum
from vd
left outer join vd vdprev
on vd.id = vdprev.id
and vd.rtime > vdprev.rtime
group by vd.id, vd.rtime, vd.duration
) vd
group by id, blocknum