回答

收藏

如何扩展此SQL查询以找到k最近的邻居?

技术问答 技术问答 221 人阅读 | 0 人回复 | 2023-09-14

我有一个充满二维数据的数据库-地图上的点。每个记录都有几何字段。我需要做的是将一个点传递给存储过程,并返回 k个6 j- ?' h2 q, e! ]4 ~6 u
最近的点(k也将传递给sproc,但这很容易)http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-$ d9 i/ @7 K8 f1 |, x* x
neighbors.aspx我在上面找到了一个查询,可以获得最近的单个邻居,但我不知道如何将其扩展到 k个    最近的邻居。
4 S- q2 K6 H( }# a( t% g$ q这是目前的查询-T是表,g是geometry字段,@x是要搜索的点,Numbers是整数1到 n    的表:
$ v, Y  ^# N/ Z+ N. k/ EDECLARE @start FLOAT = 1000; WITH NearestPoints AS(     SELECT TOP(1) WITH TIES *, T.g.STDistance(@x) AS dist     FROM Numbers JOIN T WITH(INDEX(spatial_index))      ON T.g.STDistance(@x) 内部查询选择最新的非空区域,然后外部查询选择该区域最高的结果。外部查询可以很容易地改变(eg)SELECTTOP(20),但如果最近的区域只包含一个结果,那么你就会被它困扰。% x- [9 v# s  r* r
我想我可能需要包括  k    条记录的第一个区域,但不使用表变量(这将导致维护问题,因为您必须创建表结构并容易更改-字段很多),我看不见。; {7 ?6 I+ O# O  ?0 T/ B: \, M
                                                                3 e+ `# z0 v6 y( b; J* W$ u- L
    解决方案:                                                               
! @3 t" O$ j2 }6 A                                                                如果TOP (1) WITH TIES从内部查询中删除并设置外部查询,返回前 k    行,会发生什么?7 o" h* w/ ~  n7 H! q
我也想知道这个修正案是否有帮助。它应该比使用更好。TOP以下命令更有效:2 a" p% ?2 @/ |- j6 V
DECLARE @start FLOAT =    @k INT =      ,@p FLOAT = 2;WITH NearestPoints AS(     SELECT *  T.g.STDistance(@x) AS dist  ROW_NUMBER() OVER (ORDER BY T.g.STDistance(@x)) AS rn     FROM Numbers      JOIN T WITH(INDEX(spatial_index))      ON   T.g.STDistance(@x) = @start*POWER(@p,Numbers.n -         )SELECT * FROM NearestPointsWHERE rn 注:未经测试-我不能来这里SQL 2008。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则