基于离散GPS消息的连续旅行

时间:2017-11-08 18:11:46

标签: sql postgresql gps gaps-and-islands

假设我们有一张表格,其中包含GPS追踪器定期发送的数据。

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

当发送消息时,它包含时间戳,速度等,并且当汽车行驶时 trip_distance 增长,并在停止时重置为0。

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

目标是使SQL查询生成TRIP whit这样的签名:

from_date, to_date, trip_distance

其中from_date是trip_distance = 0时的日期时间 ( 2017-10-26T13:41:41 在第一行)
to_date是trip_distance变为0之前的最后一行的日期时间 (比如排在前一行(' 2017-10-26T14:03:38' ,12.0,13.5))

我唯一的解决方案是在循环中顺序迭代SELECT结果。 有人有任何ide如何通过SQL做到这一点?

1 个答案:

答案 0 :(得分: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