【问题标题】:SQL: Determine time spent at locations (Snowflake)SQL:确定在位置花费的时间(雪花)
【发布时间】:2021-07-06 21:55:15
【问题描述】:

我想确定当对象位于重复位置时在该位置所花费的时间。有什么想法可以在两天内使用三个 ObjectID 从这个数据样本中推导出来吗?谢谢

ObjectID DateTime Lat 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 Lat 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 小时

【问题讨论】:

  • 我迷路了。在 2021 年 5 月 3 日 12:00 和 2021 年 5 月 3 日 16:00 之间以及 2021 年 5 月 3 日 16:00 和 2021 年 5 月 3 日 23:00 之间,物体 23 在哪里?
  • @GordonLinoff :数据是在随机时间收集的,而不是在到达或离开时。因此,我们不知道对象 23 在 5/3 12:00 和 5/3 16:00 之间的位置。我们可以假设它在我们想要计算 TimeInLocation 的位置花费了一些时间,并且在旅行中花费了一些时间,但数据并未证实这一点。我的真实数据通常会反映旅行中的多个 LAT/LON 位置。我没有在示例中显示减少行数,以试图使数据更易于理解。谢谢!

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


【解决方案1】:

如果我没听错的话,这是一种孤岛问题。您可以使用不同的行号来获取多行的位置:

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;

【讨论】:

  • 谢谢 - 这似乎完全符合我的需要。对于其他阅读本文的人,“-”运算符在 Snowflake 中对我不起作用,因此我将 Gordon 代码的第一行替换为:- select objectid, lat, lon, min(datetime), TIMESTAMPDIFF('second',最大值(日期时间),最小值(日期时间))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 2021-01-27
相关资源
最近更新 更多