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 对象在某个位置的每个时间段。
我正在尝试确定一个对象在同一位置的时长,以及它在该持续时间内首次到达该位置的时间。如果它离开该位置并返回,我需要另一行进行新的时间计算。
数据:
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 对象在某个位置的每个时间段。