Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как мога да разширя тази SQL заявка, за да намеря k най-близките съседи?

Какво се случва, ако премахнете TOP (1) WITH TIES от вътрешната заявка и настройте външната заявка да връща горното k редове?

Също така ще ми е интересно да знам дали тази поправка изобщо помага. Би трябвало да е по-ефективно от използването на 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 - нетествано - нямам достъп до 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 Log Shipping &Disaster Recovery Installation and Configuration -1

  2. Деактивирайте всички неклъстерирани индекси

  3. Как да импортирате bak файл в SQL Server Express

  4. Как да направя резервно копие на база данни в друг компютър в Sql Server 2008?

  5. Разделяне на датата на 2 колони (дата + час) в SQL