Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak mogę rozszerzyć to zapytanie SQL, aby znaleźć k najbliższych sąsiadów?

Co się stanie, jeśli usuniesz TOP (1) WITH TIES z zapytania wewnętrznego i ustaw zapytanie zewnętrzne tak, aby zwracało pierwsze k wiersze?

Chciałbym też wiedzieć, czy ta poprawka w ogóle pomaga. Powinno być bardziej wydajne niż użycie 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 - nieprzetestowane - nie mam tutaj dostępu do SQL 2008.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 i porównanie znaków Unicode

  2. Jak obsługiwać i usuwać zarówno pojedyncze, jak i podwójne cudzysłowy w instrukcji SQL-Update

  3. Obejście wyrażeń regularnych programu SQL Server w języku T-SQL?

  4. Zliczanie Liczba kolejnych wystąpień wartości w tabeli

  5. Wybierz górne 10 procent, a także dolny procent w SQL Server