我有一个数据库充满了二维数据 - 地图上的点。每条记录都有一个几何类型的字段。我需要做的是将一个点传递给一个存储过程,该存储过程返回最近的点(k也会传递给存储过程,但这很容易)。我在http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-neighbors.aspx找到了一个查询,该查询得到了最近的一个邻居,但是我不知道如何扩展它以找到最近的邻居。如何扩展此SQL查询以查找k个最近邻居?
这是当前的查询 - T
是表,g
是几何字段,@x
是指向搜索周围,Numbers
是整数的表1至Ñ:
DECLARE @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) < @start*POWER(2,Numbers.n)
ORDER BY n
)
SELECT TOP(1) * FROM NearestPoints
ORDER BY n, dist
内查询选择最近的非空区域,外部查询然后选择该区域的最前面的结果;外部查询可以很容易地更改为(例如)SELECT TOP(20)
,但是如果最近的区域只包含一个结果,那么您就会被困住。
我想我可能需要递归搜索第一个包含记录的区域,但是不使用表变量很多领域),我看不出如何。
如果将INNER查询更改为超过TOP(1)对查找k个记录时的结果有什么影响?(当最近的区域只包含一个结果时) – kevchadders 2010-03-26 11:58:00
如果更改内部查询以选择更多区域,则可以获得更多结果,但这不会保护更多结果:其他区域可能只包含相同的单个结果(它们会增加大小按指数规律) - 例如想象一下在附近有一个点的点上搜索,但是在几百公里附近没有其他点 - 第一个_n_区域将包含相同的1点。 – Smigs 2010-03-26 12:02:46
是否曾经发现过这个工作解决方案?我正在寻找相同的解决方案。 – 2010-11-14 00:05:47