SQL:确定在位置花费的时间(雪花)

时间:2021-07-06 21:55:15

标签: sql location snowflake-cloud-data-platform latitude-longitude

当对象位于重复的位置时,我想确定在位置上花费的时间。任何想法如何在两天内使用三个 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 小时

1 个答案:

答案 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;