Надо найти длительность непрерывного нахождения на станцииях
Всем привет.
Есть таблица: ИД абонента, ИД станции, Дата события.
Надо найти длительность непрерывного нахождения на станциях. Решаю в Oracle, но потом перенесу решение в pySpark.
Рассчитала длительность события,
флаг_lead = 0, если следующее событие на той же станции,
флаг_lag = 0, если предыдущее событие на той же станции. Если значение этих друх флагов перемножить, то, вроде, получаю нужный критерий для группировки строк.
select subs_id,
base_stat_id,
subs_act_date,
coalesce(lead(subs_act_date, 1)over(partition by subs_id order by subs_act_date), sysdate) as end_subs_act_date,
coalesce(lead(subs_act_date, 1)over(partition by subs_id order by subs_act_date), sysdate) - subs_act_date as duration,
case when lead(base_stat_id, 1)over(partition by subs_id order by subs_act_date) = base_stat_id then 0 else 1 end *
case when lag(base_stat_id, 1)over(partition by subs_id order by subs_act_date) = base_stat_id then 0 else 1 end as bs_flag
from (
select 1 as subs_id, 1 as base_stat_id, to_date('8:40', 'hh24:mi') as subs_act_date from dual
union all select 1,1,to_date('8:55', 'hh24:mi') from dual
union all select 1,1,to_date('9:20', 'hh24:mi') from dual
union all select 1,2,to_date('10:00', 'hh24:mi') from dual
union all select 1,1,to_date('11:15', 'hh24:mi') from dual
union all select 1,2,to_date('12:00', 'hh24:mi') from dual
union all select 1,2,to_date('13:50', 'hh24:mi') from dual
union all select 1,2,to_date('18:50', 'hh24:mi') from dual
union all select 1,1,to_date('18:55', 'hh24:mi') from dual
union all select 1,1,to_date('19:20', 'hh24:mi') from dual
)src_tab
Не могу придумать, как отделить данные из блоков 1 и 2. Так как между этими блоками абонент был на других станциях и объединять длительность нахождения в эти периоды нельзя.