随机移动的物体之间的最近位置

时间:2018-06-26 21:15:26

标签: sql math

我有一个很大的数据库表,其中包含与各种对象(每个对象都有唯一的对象标识符)相关联的网格引用(X和Y),它们随时间推移而移动。这些物体以近似恒定的速度移动,但方向随机。

桌子看起来像这样……。

CREATE TABLE positions (
  objectId              INTEGER,
  x_coord              INTEGER,
  y_coord              INTEGER,
  posTime             TIMESTAMP);

我想找出哪些对象在什么时候彼此最靠近。

找到两个定位点之间的距离相对容易-简单的毕达哥拉斯(Pythagoras)可以解决X和Y值之间的差异。

第一个问题似乎是数量问题。网格本身很大,可能有100,000个X坐标和类似数量的Y坐标。在任何给定的时间段内,表格可能包含10,000个网格参考位置,这些位置用于1000个不同的对象-总计1000万行。 这本身并不是一个很大的数目,但我想不出一种避免进行“产品查询”以将每个修订与其他修订进行比较的方法。进行1000万行将产生1亿个结果。 下一个问题是,我不仅对彼此之间最接近的两个修补程序感兴趣,而且对与 different 对象最接近的两个修复程序感兴趣。 另一个问题是,我需要匹配时间和位置–我不仅对访问相同网格正方形的两个对象不感兴趣,而且他们需要在相同时这样做。 / p>

另一点(可能不相关)是这些物品不太可能在同一时间完全占据相同的位置。

我已经完成了一个简单的产品查询,其中包含一些示例行,但是我不确定下一步如何。我开始认为这是行不通的,我可以通过一个SQL查询来完成(请证明我是错误的),而且我可能必须提取数据并将其进行一些过程编程。

有什么建议吗?

我不确定哪种SE论坛最适合–数据库SQL?编程?数学?

更新-另一个增加复杂性的问题是,每个对象和位置的时间戳均不规则,一个项目可能在14:10:00记录了位置,而另一个项目在14:10:01记录了位置。如果这两个位置彼此相邻且相隔一秒,则尽管时间不匹配,它们实际上可能代表最近的位置!

1 个答案:

答案 0 :(得分:0)

为了减少测试组合的数量,您应该使用子查询通过postime将其分开。另外,建议您通过postime创建索引以提高性能。

create index ix1_time on positions (postime);

由于您没有提到任何特定的数据库,因此我假设使用PostgreSQL,因为它易于使用(对我而言)。解决方案应如下所示:

with t as (
  select distinct(postime) as pt from positions
)
select *
  from t,
  (
  select * 
    from (
      select
        a.objectid as aid, b.objectid as bid,
        a.x_coord + a.y_coord + b.x_coord + b.y_coord as dist -- fix here!
      from t
      join positions a on a.postime = t.pt
      join positions b on b.postime = t.pt
      where a.objectid <> b.objectid
      ) x
    order by dist desc
    limit 1
  ) y;

此SQL应按邮寄方式相互比较每个10000个对象。它将为每个不同的后置时间值测试1000万个组合,但不会针对其他后置时间值进行测试。

请注意:我使用a.x_coord + a.y_coord + b.x_coord + b.y_coord作为距离公式。我将正确的代码留给您在这里实施。

总共将计算1000万x 1000的时间值:总计100亿次比较。它将为每个时间点返回最接近的两个点,总共1000行。