sql - 找到最近目的地的最快方法

标签 sql sql-server sql-server-2005

这是一个由两个表表示的网络。 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;

Fiddle Here

示例输出:(来自您的测试数据)

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

关于sql - 找到最近目的地的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17173862/

相关文章:

sql - 如何在内容类型中最好地集成现有数据库数据

c# - Skip and Take 在 Entity Framework 中生成异常

sql - 错误: Cannot fetch a row from OLE DB provider "ADsDSOObject" for linked server "ADSI"

c++ - 无法将数据插入 SQL Server 数据库 ODBC C++

sql-server - 使用存储过程中的位输入来确定如何过滤where子句中的结果

mysql - 是否可以在 MySQL 表上执行内联 GROUP BY?

sql - 为范围内的缺失值补零

sql-server - 具有事件源的 CQRS 模式具有用于读/写的单个数据库

sql-server-2005 - 如何在T-SQL中分割字符串?

sql - 如何将更新的记录移动到历史表中?