select sprawdzający wjechanie i wyjechanie z sieci o danym kodzie operatora

0

Witam,
Mam prośbę o pomoc w skonstruowaniu selecta, który pozwoli mi badać godzinę wjazdu/wyjazdu do/z danego obszaru na podstawie kodu operatora.

Zamieszam przykład:
http://sqlfiddle.com/#!17/279ef/2

W powyższym przykładzie chciałbym uzyskać:

NULL / jako wjazd do obszaru o kodzie 26001 ponieważ jest to pierwsza dana i tak naprawdę nie wiadomo czy konkretnie wtedy nastąpił wjazd
2017-11-01 02:53:00 / jako wyjazd z obszaru o kodzie 26001

2017-11-01 02:54:00 / jako wjazd do obszaru o kodzie 26002
2017-11-02 02:55:30 / jako wyjazd z obszaru o kodzie 26002

2017-11-02 02:56:40 / jako wjazd do obszaru o kodzie 26003
NULL / jako wyjazd z obszaru o kodzie 26003 ponieważ jest to ostatnia dana i tak naprawdę nie wiadomo czy pojazd nadal się tam nie znajduje

Myślałem na skonstruowaniem tego selecta i nie mam pomysłu jak to rozwiązać. Proszę o pomoc.

0

brzydkie to ale działa. Da się to zapewne zrobić ładniej funkcjami okna ale nie mam głowy wymyślać

select
  gsmoperator, 
  case when min(ts) = (select min(ts) from device_data) then null else min(ts) end wjazd,
  case when max(ts) = (select max(ts) from device_data) then null else max(ts) end wyjazd
from
  device_data
group by
  gsmoperator
0

Dziękuję za dotychczasową pomoc. Pisałem też wiadomość prywatną ale wkleję tutaj.

O ile na przykładzie który wkleiłem select działa to na mojej bazie nie do końca. Chodzi o to, że GROUP BY grupuje wynik, dany kod operatora wystąpi raz, a to nie jest tak, że jak raz wjechał to już tam nie wjedzie. Może być tak, że najpierw jest 26001 później 26003 a później znowu 26001. Tutaj mam przykład:

http://sqlfiddle.com/#!17/daee0/2

Można użyć czegoś innego niż GROUP BY? Będę wdzięczny za podpowiedź.

0

musisz mieć jakieś id, które Ci pogrupuje poszczególne gsmoperator. Można to zrobić np. tak http://sqlfiddle.com/#!17/f7410/7 z tym, że musisz mieć świadomość, że co jakiś dłłuuugggiii czas to zapytanie źle się wyświetli - kolejność się popieprzy w momencie przeskoczenia sekwencji z powrotem na 1

0

U mnie jednak to nie działa tak jak należy. Mam ponad 100000 wierszy w tabeli i gdzieś jest problem. Nie wiem gdzie.

0

jeśli struktura jest taka jak podałeś w przykładzie to musi działać. Bez danych na których nie działa ciężko będzie coś podpowiedzieć. Jeśli to nie tajemnica to możesz wyeksportować tą jedną tabelę spakować i gdzieś wstawić dane

0

Udało mi się to zrobić na przykładzie:
http://sqlfiddle.com/#!17/27812/1
Dodałem po prostu kolejne deviceid, które przeplata się z pozostałymi danymi.

Powinienem otrzymać coś takiego:
12345/26001 - null/2017-11-01 02:52:00
12345/26002 - 2017-11-01 02:53:00/2017-11-01 02:54:00
12345/26003 - 2017-11-01 02:55:00/2017-11-01 02:55:10
12345/26002 - 2017-11-02 02:55:20/2017-11-02 02:55:30
12345/26001 - 2017-11-02 02:56:40/null

54321/26003 - null/2017-11-01 02:52:00
54321/26001 - 2017-11-01 02:53:00/2017-11-01 02:54:00
54321/26003 - 2017-11-01 02:55:00/2017-11-01 02:55:10
54321/26001 - 2017-11-02 02:55:20/2017-11-02 02:55:30
54321/26002 - 2017-11-02 02:56:40/null

A niestety jest dużo więcej wyników niż potrzeba i nawet z tą samą godziną wjazdu i wyjazdu ale to pewnie przez to, że dane się przeplatają. Można to w jakiś sposób posortować najpierw po deviceid potem po ts i dopiero wtedy wyciągać selecta?

0

trzeba dodać sortowanie po deviceId http://sqlfiddle.com/#!17/27812/3 mam wrażenie, że nie do końca wiesz co ten SQL robi :)

0

dziękuję, jakoś nie mogłem sobie z tym poradzić. zmęczenie materiału.

1 użytkowników online, w tym zalogowanych: 0, gości: 1