2

これは、2 つのテーブルとして表されるネットワークです。P テーブルには、ソース ノードとその座標があります。このテーブルには約 8M のレコードがあります。

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 ノードを見つけて、P テーブルの ClosestG フィールドに GID を入力する最速の方法を見つけたいと考えています。ありがとう。

4

1 に答える 1

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;

ここでフィドル

出力例: (テストデータから)

PID     X    Y     CLOSETG 
ABCEFO1 10.1 1.1   431 
XFEW134 30.3 -20.1 123 
于 2013-06-18T16:54:01.753 に答える