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 在同一位置出现了两次:
5/2 12:00-5/2 16:00,因此返回一行显示 4 小时
5/2 23:00-5/3 12:00,所以返回的另一行显示 13 小时
对象 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;
我想确定当对象位于重复位置时在该位置花费的时间。有什么想法可以在两天内使用三个 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 在同一位置出现了两次:
5/2 12:00-5/2 16:00,因此返回一行显示 4 小时
5/2 23:00-5/3 12:00,所以返回的另一行显示 13 小时
对象 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;