Tôi có một cơ sở dữ liệu đầy đủ các dữ liệu hai chiều - các điểm trên bản đồ. Mỗi bản ghi có một trường của loại hình. Những gì tôi cần để có thể làm là vượt qua một điểm đến một thủ tục lưu trữ mà trả về k điểm gần nhất (k cũng sẽ được thông qua để các sproc, nhưng đó là dễ dàng). Tôi đã tìm thấy truy vấn tại số http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-neighbors.aspx để nhận được người hàng xóm gần nhất, nhưng tôi không thể tìm cách mở rộng nó để tìm các số hàng xóm gần nhất là k.Làm cách nào để mở rộng truy vấn SQL này để tìm k hàng xóm gần nhất?
Đây là truy vấn hiện tại - T
là bàn, g
là lĩnh vực hình học, @x
là điểm để tìm kiếm xung quanh, Numbers
là một bảng với số nguyên 1-n:
DECLARE @start FLOAT = 1000;
WITH NearestPoints AS
(
SELECT TOP(1) WITH TIES *, T.g.STDistance(@x) AS dist
FROM Numbers JOIN T WITH(INDEX(spatial_index))
ON T.g.STDistance(@x) < @start*POWER(2,Numbers.n)
ORDER BY n
)
SELECT TOP(1) * FROM NearestPoints
ORDER BY n, dist
Các nội truy vấn chọn vùng không trống gần nhất và truy vấn bên ngoài sau đó chọn kết quả trên cùng từ vùng đó; truy vấn bên ngoài có thể dễ dàng được thay đổi thành (ví dụ) SELECT TOP(20)
, nhưng nếu khu vực gần nhất chỉ chứa một kết quả, bạn sẽ bị mắc kẹt với điều đó.
Tôi có thể cần phải đệ quy tìm kiếm vùng đầu tiên có chứa k bản ghi, nhưng không sử dụng biến bảng (điều này sẽ gây ra sự cố bảo trì khi bạn phải tạo cấu trúc bảng và có thể thay đổi) lại rất nhiều lĩnh vực), tôi không thể thấy như thế nào.
Điều gì ảnh hưởng đến việc thay đổi truy vấn INNER thành hơn TOP (1) có kết quả khi tìm k hồ sơ?(khi vùng gần nhất chỉ chứa một kết quả) – kevchadders
Nếu bạn thay đổi truy vấn bên trong để chọn nhiều vùng hơn, bạn có thể nhận được nhiều kết quả hơn, nhưng điều này không _guarantee_ nhiều kết quả hơn: các khu vực khác chỉ có thể chứa cùng một kết quả. theo kích thước theo cấp số nhân) - ví dụ tưởng tượng tìm kiếm xung quanh một điểm có một điểm gần đó, nhưng không có điểm nào khác cho hàng trăm cây số xung quanh - các vùng _n_ đầu tiên sẽ chỉ chứa cùng 1 điểm. – Smigs
Có phải là giải pháp làm việc cho việc này không? Tôi đang tìm giải pháp tương tự. –