2017-11-08 3 views
1

Nehmen wir an, wir haben eine Tabelle mit Daten, die regelmäßig per GPS-Tracker gesendet werden.Kontinuierliche Fahrten basierend auf diskreten GPS-Nachrichten

CREATE TABLE unit_messages 
(datetime timestamp, speed numeric, trip_distance numeric); 

Es enthält Zeitstempel, wenn die Nachricht gesendet wird, Geschwindigkeit usw. und trip_distance wachsen, wenn Auto fährt und auf 0 zurückgesetzt, wenn er gestoppt wurde.

('2017-10-26T13:41:41', 0.0, 0.0), 
('2017-10-26T13:41:57', 23.0, 0.1), 
('2017-10-26T13:42:01', 11.0, 0.1), 
('2017-10-26T13:42:18', 20.0, 0.2), 
('2017-10-26T13:42:33', 56.0, 0.4), 
('2017-10-26T13:42:41', 58.0, 0.5), 
('2017-10-26T13:43:13', 0.0, 0.6), 
... 
('2017-10-26T14:03:38', 12.0, 13.5), 
('2017-10-26T15:21:52', 0.0, 0.0) 

Ziel ist es, SQL-Abfrage Herstellung eines TRIP Whit solche Signatur zu erstellen:

from_date, to_date, trip_distance 

wo from_date Date wenn trip_distance = 0
(2017-10-26T13: 41: 41 in der ersten Zeile)
und to_date ist datetime der letzten Zeile vor trip_distance wurde 0
(wie in Zeile ('2017-10-26T14: 03: 38', 12.0, 13.5) vor dem letzten)

Die einzige Lösung, die ich habe, ist sequenziell über das Ergebnis von SELECT in einer Schleife zu durchlaufen. Hat jemand eine Idee, wie man das mit SQL macht?

+0

Erstellen Sie einfach Gruppen basierend auf dem Abstand 0.0. https://stackoverflow.com/questions/tagged/gaps-and-islands –

Antwort

2
WITH cte as (
    SELECT *, 
      COUNT(CASE WHEN trip_distance = 0 THEN 1 END) 
      OVER (ORDER BY datetime) as grp 
    FROM unit_messages 
) 
SELECT MIN(datetime), MAX(datetime), MAX(trip_distance) 
FROM cte 
GROUP BY grp 
Verwandte Themen