如何解决SQL:确定在位置花费的时间雪花
当对象位于重复的位置时,我想确定在位置上花费的时间。任何想法如何在两天内使用三个 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 小时
解决方法
如果我正确地遵循,这是一种间隙和岛屿问题。您可以使用行号的差异获得多于一行的位置:
select objectid,lat,lon,timestampdiff(second,max(datetime),min(datetime))
from (select t.*,row_number() over (partition by objectid,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),lon
having count(*) > 1;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。