当对象位于重复的位置时,我想确定在位置上花费的时间。任何想法如何在两天内使用三个 ObjectID 从这个数据样本中推导出来?谢谢
ObjectID | 日期时间 | 纬度 | Lon |
---|---|---|---|
23 | 5/2/2021 12:00 | 40.11 | -30.34 |
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 | 39.88 | -29.00 |
23 | 5/3/2021 23:00 | 40.11 | -30.34 |
24 | 5/2/2021 12:00 | 40.11 | -30.34 |
24 | 5/2/2021 16:00 | 40.11 | -30.34 |
24 | 5/2/2021 23:00 | 39.88 | -29.00 |
24 | 5/3/2021 12:00 | 39.88 | -29.00 |
24 | 5/3/2021 16:00 | 40.11 | -30.34 |
24 | 5/3/2021 23:00 | 39.88 | -29.00 |
25 | 5/2/2021 12:00 | 40.11 | -30.34 |
25 | 5/2/2021 16:00 | 39.88 | -29.00 |
25 | 5/2/2021 23:00 | 40.11 | -30.34 |
25 | 5/3/2021 12:00 | 39.88 | -29.00 |
25 | 5/3/2021 16:00 | 40.11 | -30.34 |
25 | 5/3/2021 23:00 | 40.11 | -30.34 |
Desired Output 应该是 ObjectID、该位置最早的 DateTime 和该位置的时间:
ObjectID | StartingDateTime | 纬度 | Lon | TimeInLocation |
---|---|---|---|---|
23 | 5/2/2021 12:00 | 40.11 | -30.34 | 24:00:00 |
24 | 5/2/2021 12:00 | 40.11 | -30.34 | 04:00:00 |
24 | 5/2/2021 23:00 | 39.88 | -29.00 | 13:00:00 |
25 | 5/3/2021 16:00 | 40.11 | -30.34 | 07:00:00 |
ObjectID 23 从 5/2 12:00-5/3 12:00 位于同一位置,因此返回一行显示 24 小时
ObjectID 24 在同一位置两次:
5/2 12:00-5/2 16:00,因此返回一行显示 4 小时
5/2 23:00-5/3 12:00,因此返回另一行显示 13 小时
ObjectID 25 从 5/3 16:00-5/3 23:00 位于同一位置,因此返回一行显示 7 小时
答案 0 :(得分:2)
如果我正确地遵循,这是一种间隙和岛屿问题。您可以使用行号的差异获得多于一行的位置:
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;