SQL:确定在各个地点花费的时间(雪花)

SQL: Determine time spent at locations (Snowflake)

我想确定当对象位于重复位置时在该位置花费的时间。有什么想法可以在两天内使用三个 ObjectID 从该数据样本中得出吗?感谢

对象ID 日期时间 纬度 经度
23 2021 年 5 月 2 日 12:00 40.11 -30.34
23 2021/5/216:00 40.11 -30.34
23 2021/5/223:00 40.11 -30.34
23 2021/5/312:00 40.11 -30.34
23 2021 年 5 月 3 日 16:00 39.88 -29.00
23 2021/5/323:00 40.11 -30.34
24 2021 年 5 月 2 日 12:00 40.11 -30.34
24 2021/5/216:00 40.11 -30.34
24 2021/5/223:00 39.88 -29.00
24 2021/5/312:00 39.88 -29.00
24 2021 年 5 月 3 日 16:00 40.11 -30.34
24 2021/5/323:00 39.88 -29.00
25 2021 年 5 月 2 日 12:00 40.11 -30.34
25 2021/5/216:00 39.88 -29.00
25 2021/5/223:00 40.11 -30.34
25 2021/5/312:00 39.88 -29.00
25 2021 年 5 月 3 日 16:00 40.11 -30.34
25 2021/5/323:00 40.11 -30.34

所需的输出应该是 ObjectID、该位置最早的 DateTime 以及该位置的时间:

对象ID 开始日期时间 纬度 经度 TimeInLocation
23 2021 年 5 月 2 日 12:00 40.11 -30.34 24:00:00
24 2021 年 5 月 2 日 12:00 40.11 -30.34 04:00:00
24 2021/5/223:00 39.88 -29.00 13:00:00
25 2021 年 5 月 3 日 16:00 40.11 -30.34 07:00:00

对象 ID 23 在 5/2 12:00-5/3 12:00 的同一位置,因此返回的一行显示 24 小时

ObjectID 24 在同一位置出现了两次:

对象 ID 25 在 5/3 16:00-5/3 23:00 的同一位置,因此返回的一行显示 7 小时

如果我没看错的话,这是一种孤岛问题。您可以使用不同的行号来获取多行的位置:

select objectid, lat, lon,
       timestampdiff(second, max(datetime), min(datetime))
from (select t.*,
             row_number() over (partition by objectid, lat, lon order by datetime) as seqnum_2,
             row_number() over (partition by objectid order by datetime) as seqnum
      from t
     ) t
group by objectid, (seqnum - seqnum_2), lat, lon
having count(*) > 1;