créé une table temporaire:
create table tmp_time_gap
(time date,
llat varchar2(10 char),
llong varchar2(10 char));
et chargé les données de l'échantillon:
insert into tmp_time_gap values (trunc(sysdate) + INTERVAL '11:00:00' hour to second(0), '50.23', '4.3');
insert into tmp_time_gap values (trunc(sysdate) + INTERVAL '11:00:20' hour to second(0), '51.23', '5.3');
...
utilisant lag/plomb et une expression de cas:
select time, llat, llong, start_stop
from
(
select t.*,
case when t.time_diff_seconds2 is null then 'Start' --first row
when t.time_diff_seconds is null then 'End' --last row
when t.time_diff_seconds > 20 then 'End'
when t.time_diff_seconds2 > 20 then 'Start'
else null
end start_stop
from (
select time,
(lead(time, 1) over (order by time)-time) * 24*60*60 as time_diff_seconds,
(time - lag(time, 1) over (order by time)) * 24*60*60 as time_diff_seconds2,
llat, llong
from tmp_time_gap
) t
)
where start_stop is not null
Résultat:
Remarques: Si vous avez un «espace» juste après la première rangée, alors les deux premières rangées seront une rangée «Démarrer». Je ne sais pas si cela pourrait se produire dans votre jeu de données, mais si c'est un problème, vous pourriez modifier l'instruction de cas, et avoir l'étiquette 'Start-End' pour ce scénario. La même chose pourrait se produire pour la dernière ligne (deux étiquettes de fin), et en fait, cela pourrait se produire InBetween aussi, par exemple:
insert into tmp_time_gap values (trunc(sysdate) + INTERVAL '11:07:00' hour to second(0), '60.00', '14.00');
Ce dernier pourrait être résolu en ajoutant la condition suivante après la « ligne --last » branche de l'affaire stmt:
when t.time_diff_seconds > 20 and t.time_diff_seconds2 > 20 then 'Start-End (middle)'
Quel est le type de votre colonne TIME et pourquoi ne stockez-vous que l'heure? –
S'il vous plaît poster la requête que vous avez essayé. – Nitish
@TimBiegeleisen Il stocke le datetime complet .. Je viens de poster l'heure ici que l'entrée sera une seule date –