Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để mở rộng truy vấn SQL này để tìm k láng giềng gần nhất?

Điều gì sẽ xảy ra nếu bạn xóa TOP (1) WITH TIES từ truy vấn bên trong và đặt truy vấn bên ngoài để trả về đầu k hàng?

Tôi cũng muốn biết liệu sửa đổi này có giúp ích gì không. Nó sẽ hiệu quả hơn sử dụng 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 - chưa được kiểm tra - Tôi không có quyền truy cập vào SQL 2008 ở đây.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Viết một số có hai chữ số thập phân SQL Server

  2. Bản ghi ngẫu nhiên từ một bảng cơ sở dữ liệu (T-SQL)

  3. Chạy Python Script từ MSSQL

  4. Làm cách nào để chèn dữ liệu tệp nhị phân vào trường SQL nhị phân bằng câu lệnh chèn đơn giản?

  5. Tạo thông báo lỗi tùy chỉnh trong kiểm tra ràng buộc trong SQL SERVER 2008