sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag utöka den här SQL-frågan för att hitta de k närmaste grannarna?

Vad händer om du tar bort TOP (1) WITH TIES från den inre frågan, och ställ in den yttre frågan för att returnera den översta k rader?

Jag skulle också vara intresserad av att veta om detta ändringsförslag överhuvudtaget hjälper. Det borde vara mer effektivt än att använda 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;

OBS - oprövad - jag har inte tillgång till SQL 2008 här.



  1. Det går inte att stoppa MySQL på OS X 10.10

  2. COALESCE() för tomma (men inte null) fält

  3. PHP- och MYSQL-databasanslutning och tabellskapande endast en gång

  4. hur kan jag se om mysql_real_escape_string fungerar