У меня есть база данных, полная двумерных данных - точек на карте. Каждая запись имеет поле типа геометрии. То, что мне нужно, это передать точку в хранимую процедуру, которая возвращает k ближайших точек (k также будет передан в sproc, но это легко). Я нашел запрос на http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-neighbors.aspx, который получает единственного ближайшего соседа, но я не могу понять, как его расширить, чтобы найти ближайших соседей k.Как я могу расширить этот 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
Если вы измените внутренний запрос, чтобы выбрать другие регионы, вы можете получить больше результатов, но это не будет _guarantee_ больше результатов: другие регионы могут содержать только один и тот же результат (они увеличиваются по экспоненте) - например воображайте поиск вокруг точки, которая имеет одну точку поблизости, но никаких других точек на сотни километров вокруг - первые _n_ области будут содержать только одну точку. – Smigs
Было ли это рабочим решением для этого? Я ищу то же самое решение. –