sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik deze SQL-query uitbreiden om de k dichtstbijzijnde buren te vinden?

Wat gebeurt er als je TOP (1) WITH TIES . verwijdert? van de inner query, en stel de outer query in om de bovenste k . te retourneren rijen?

Ik zou ook graag willen weten of dit amendement überhaupt helpt. Het zou efficiënter moeten zijn dan het gebruik van 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 - niet getest - ik heb hier geen toegang tot SQL 2008.



  1. Ontleden mySQL-queryresultaten en formulierarray voor if/else

  2. Trigger die alleen de ingevoegde rij bijwerkt

  3. Hoe kan ik een SQL Server LocalDb-database van de ene machine naar de andere verplaatsen?

  4. Wat is het verschil tussen een unieke sleutel met 'niet null'-beperking en een primaire sleutel?