2013-06-18 56 views
2

这是一个表示为两个表格的网络。 P表具有源节点及其坐标。这张表中大约有800万条记录。找到最近的目的地的最快方法

PID  | x | y  | ClosestG 
XFEW134 | 30.3 | -20.1 | 
ABCEFO1 | 10.1 | 1.1 | 

G表具有与每个P源节点相关联的目的节点(及其坐标)。这张桌子大约有24K。

PID  | GID | x | y 
XFEW134 | 431 | -10.3 | -13.2 
XFEW134 | 123 | 31.3 | -10.3 
XFEW134 | 251 | 22.5 | 100.1 
ABCEFO1 | 521 | 99  | -75.4 
ABCEFO1 | 431 | -10.3 | -13.2 

我想找到最快的方式为每个P找到最近的G节点,并使用GID填充P表中的ClosestG字段。谢谢。

+0

你将如何计算距离?它完全有可能,确实可能有可能存在一些联系。喜欢这个? http://www.mathopenref.com/coorddist.html – Jodrell

+0

噢,我使用毕达哥拉斯定理的P和G之间的坐标。 – John

+0

每个G都有一个PID。只有那些属于同一PID符合条件的G?或者你想排除属于同一个PID的任何G?或者是其他东西? –

回答

2

那么,这会工作,

它计算距离的各P到每个相关G幅度。然后选择最低幅度的G

请注意,除非实际需要距离,否则没有必要使用SQRT函数。

WITH [ByDistance] AS 
(
SELECT 
      P.[PId], 
      G.[GId], 
      ROW_NUMBER() OVER(PARTITION BY P.[PId] ORDER BY 
      (SQUARE(G.[x] - P.[x]) + 
       SQUARE(G.[y] - P.[y])) ASC) RowOrder 
    FROM 
      [P] 
     JOIN 
      [G] 
       ON G.[PId] = P.[PId] 

) 
SELECT 
      P.[PId], 
      P.[x], 
      P.[y], 
      D.[GId] [ClosetG] 
    FROM 
      [ByDistance] D 
     JOIN 
      [P] 
       ON P.[PId] = D.[PId] 
    WHERE 
      RowOrder = 1; 

Fiddle Here

输出示例:(从测试数据)

PID  X Y  CLOSETG 
ABCEFO1 10.1 1.1 431 
XFEW134 30.3 -20.1 123 
+0

我使用两个连接的当前查询需要8个小时才能运行,而我只有大约一小时或两小时的窗口。我要测试你的出来并让你知道结果。 – John