2013-06-18 96 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