How can I extend this SQL query to find the k nearest neighbors?

后端 未结 2 695

I have a database full of two-dimensional data - points on a map. Each record has a field of the geometry type. What I need to be able to do is pass a point to a stored procedur

2条回答
  •  Happy的楠姐
    2021-02-08 21:32

    What happens if you remove TOP (1) WITH TIES from the inner query, and set the outer query to return the top k rows?

    I'd also be interested to know whether this amendment helps at all. It ought to be more efficient than using TOP:

    DECLARE @start FLOAT = 1000
            ,@k INT = 20
            ,@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)
         AND (Numbers.n - 1 = 0 
              OR T.g.STDistance(@x) >= @start*POWER(@p,Numbers.n - 1)
             )
    )
    SELECT * 
    FROM NearestPoints
    WHERE rn <= @k;
    

    NB - untested - I don't have access to SQL 2008 here.

提交回复
热议问题