【问题标题】:SQL: How to determine how long object in same location (Snowflake)SQL:如何确定同一位置的对象有多长(雪花)
【发布时间】:2021-08-16 22:23:57
【问题描述】:

我试图确定一个对象在同一位置的时间,以及它在该时间段内第一次出现在该位置的时间。如果它离开该位置并返回,我需要另一行进行新的时间计算。

数据:

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。条目之间对象的位置被认为是未知的。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    这是一种孤岛问题。对于这个版本,行号的差异可能是最好的解决方案:

    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;
    

    这会返回对象位于某个位置的每个时间段。

    【讨论】:

    • 当对象返回到同一位置时,这不起作用。该查询将返回另一行,显示该对象从 2021 年 5 月 2 日 16:00 到 2021 年 5 月 5 日 12:00 位于 40.11/30.34。
    • 它还会返回对象在 20.77/11.66 从 5/4/2021 16:00 到 5/5/2021 16:00。
    • 我相信不同之处在于这个解决方案是找到位置之间的时间差异。当它没有在中间的其他位置时,我需要找到位置之间的时间差异。
    • @CarFrogs 。 . .我修复了查询。
    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 2021-09-21
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多