SQL:如何确定对象在同一位置的长度(雪花)

SQL: How to determine how long object in same location (Snowflake)

我正在尝试确定一个对象在同一位置的时长,以及它在该持续时间内首次到达该位置的时间。如果它离开该位置并返回,我需要另一行进行新的时间计算。

数据:

ObjectID DateTime Lat Lon
23 5/2/2021 12:00 38.09 20.99
23 5/2/2021 16:00 40.11 30.34
23 5/2/2021 23:00 40.11 30.34
23 5/3/2021 12:00 40.11 30.34
23 5/3/2021 16:00 40.11 30.34
23 5/3/2021 23:00 39.88 29.00
23 5/4/2021 12:00 39.88 29.00
23 5/4/2021 16:00 20.77 11.66
23 5/4/2021 23:00 40.11 30.34
23 5/5/2021 12:00 40.11 30.34
23 5/5/2021 16:00 20.77 11.66

期望的结果:

ObjectID StartTime Lat Lon HoursInLocation
23 5/2/2021 16:00 40.11 30.34 24:00
23 5/3/2021 23:00 39.88 29.00 13:00
23 5/4/2021 23:00 40.11 30.34 13:00

我的真实数据没有一致的DateTime频率,我在这里使用它是为了更容易阅读。真实数据也有多个 ObjectID。条目之间对象的位置被认为是未知的。

谢谢!

这是一种缺口孤岛问题。对于这个版本,行号的差异可能是最好的解决方案:

select objectid, lat, lng, min(datetime), max(datetime),
       datediff(minute, min(datetime), max(datetime)) / 60.0 as hours_diff
from (select t.*,
             row_number() over (partition by objectid, lat, lng order by datetime) as seqnum_2,
             row_number() over (partition by objectid order by datetime) as seqnum
      from t
     ) t
group by objectid, lat, lng, (seqnum - seqnum_2)
having count(*) > 1;

这 returns 对象在某个位置的每个时间段。