我有一个很大的数据库表,其中包含与各种对象(每个对象都有唯一的对象标识符)相关联的网格引用(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记录了位置。如果这两个位置彼此相邻且相隔一秒,则尽管时间不匹配,它们实际上可能代表最近的位置!
答案 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行。