sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan jeg udvide denne SQL-forespørgsel til at finde de k nærmeste naboer?

Hvad sker der, hvis du fjerner TOP (1) WITH TIES fra den indre forespørgsel, og indstil den ydre forespørgsel til at returnere den øverste k rækker?

Jeg ville også være interesseret i at vide, om dette ændringsforslag overhovedet hjælper. Det burde være mere effektivt end at bruge 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 - utestet - jeg har ikke adgang til SQL 2008 her.



  1. Sådan indsætter du json array i mysql database med php

  2. TypeORM OneToMany-filter i relationer påvirker ikke resultatet

  3. Forskellen mellem nuværende og tidligere tidsstempel

  4. Skjuler almindelig tekstadgangskode med sqlplus kommandolinje