这是一个由两个表表示的网络。 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节点,并用GID填充P表中的ClosestG字段。谢谢。
最佳答案
嗯,这可行,
它计算从每个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
关于sql - 找到最近目的地的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17173862/