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

Tính toán khoảng cách với cơ sở dữ liệu SQL Server khổng lồ

Bạn có thể làm tệ hơn là nhìn vào GEOGRAPHY kiểu dữ liệu, ví dụ:

CREATE TABLE Places
(
    SeqID       INT IDENTITY(1,1),
    Place       NVARCHAR(20),
    Location    GEOGRAPHY
)
GO
INSERT INTO Places (Place, Location) VALUES ('Coventry', geography::Point(52.4167, -1.55, 4326))
INSERT INTO Places (Place, Location) VALUES ('Sheffield', geography::Point(53.3667, -1.5, 4326))
INSERT INTO Places (Place, Location) VALUES ('Penzance', geography::Point(50.1214, -5.5347, 4326))
INSERT INTO Places (Place, Location) VALUES ('Brentwood', geography::Point(52.6208, 0.3033, 4326))
INSERT INTO Places (Place, Location) VALUES ('Inverness', geography::Point(57.4760, -4.2254, 4326))
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
    FROM Places p1
    CROSS JOIN Places p2
GO  
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
    FROM Places p1
        INNER JOIN Places p2 ON p1.SeqID > p2.SeqID
GO  

geography::Point lấy vĩ độ và kinh độ cũng như SRID (số ID tham chiếu đặc biệt). Trong trường hợp này, SRID là 4326, là vĩ độ và kinh độ tiêu chuẩn. Vì bạn đã có vĩ độ và kinh độ, bạn có thể chỉ cần ALTER TABLE để thêm cột địa lý rồi đến UPDATE để điền nó.

Tôi đã chỉ ra hai cách để lấy dữ liệu ra khỏi bảng, tuy nhiên bạn không thể tạo chế độ xem được lập chỉ mục bằng cách này (các chế độ xem được lập chỉ mục không thể có tự kết hợp). Mặc dù bạn có thể tạo một bảng phụ có hiệu quả là một bộ nhớ cache, được điền dựa trên những điều trên. Sau đó, bạn chỉ phải lo lắng về việc duy trì nó (có thể được thực hiện thông qua trình kích hoạt hoặc một số quy trình khác).

Lưu ý rằng kết hợp chéo sẽ cung cấp cho bạn 250.000.000.000 hàng, nhưng việc tìm kiếm rất đơn giản vì bạn chỉ cần nhìn vào một trong các cột địa điểm (tức là SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100 , câu thứ hai sẽ cung cấp cho bạn ít hàng hơn đáng kể, nhưng truy vấn sau đó cần phải xem xét cả cột Place1 và Place2).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tổng hợp chuỗi được nhóm / LISTAGG cho SQL Server

  2. Đối với giao dịch không cần tài khoản rẻ hơn / nhanh hơn:COMMIT hay ROLLBACK?

  3. Chèn vào bảng với câu lệnh select cộng với cột bổ sung trong SQL Server 2008

  4. Cách xuất truy vấn SQL Server 2005 sang CSV

  5. Làm cách nào để loại bỏ phần thời gian của giá trị datetime (SQL Server)?