2017-05-10 2 views
-3

J'ai un scénario où j'ai besoin de trouver les coordonnées de début et de fin entre l'écart. La structure de la table seraitTrouver les coordonnées dans SQL

enter image description here

Dans le tableau ci-dessus, la sortie sera

enter image description here

Chaque fois qu'il ya un écart, je dois prendre la valeur ci-dessus comme point final et la valeur actuelle comme point de départ. Pourriez-vous s'il vous plaît aider ici avec la requête SQL. J'ai essayé avec LAG mais toujours pas eu la sortie requise.

+1

Quel est le type de votre colonne TIME et pourquoi ne stockez-vous que l'heure? –

+0

S'il vous plaît poster la requête que vous avez essayé. – Nitish

+0

@TimBiegeleisen Il stocke le datetime complet .. Je viens de poster l'heure ici que l'entrée sera une seule date –

Répondre

0

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)'