2017-11-03 13 views

답변

0

아래 예에서는 3 개의 레코드가 있습니다. 두 명은 약 15 미터 떨어져 있으며, 세 번째는 훨씬 더 멀리 떨어져 있습니다.

여기에서는 각 레코드의 거리를 다른 레코드와 비교하여 25 미터 미만이면 동일한 위치로 간주 할 수 있습니다. (분명히 자신의 관용을 설정할 수 있습니다)

좀 더 효율적으로 할 수 있습니다. Lat 또는 Lng의 모든 "1"은 약 69 마일이므로 JOIN 조건이 더 적합 할 수 있음을 명심하십시오.

Declare @YourTable table ([PosNr] int,Lat float,Lng float,GeoPoint Geography) 
Insert Into @YourTable values 
(1,35.555925, -97.677617,null) 
,(2,35.55595, -97.677454,null) 
,(3,38.55595, -97.677454,null) 

Update @YourTable Set GeoPoint = GEOGRAPHY::Point([Lat], [Lng], 4326) 

Select Distinct 
     Pos1  = case when Pos1<Pos2 then Pos1 Else Pos2 end 
     ,Pos2  = case when Pos1<Pos2 then Pos2 Else Pos1 end 
     ,Meters 
From (
     Select Pos1 = A.[PosNr] 
       ,Pos2 = B.[PosNr] 
       ,Meters = A.GeoPoint.STDistance(B.GeoPoint) 
     From @YourTable A 
     Join @YourTable B on A.PosNr<>B.PosNr 
     ) A 
Where Meters<=25 

반환

Pos1 Pos2 Meters 
1  2  15.0366793848766 
+0

이 모든 레코드에 모든 기록을 비교 가지고 있는데이 오래 걸릴 것이다, 비교하기 위해 각 테이블의 행 수백만을 가지고 있기 때문에 처리 시간? 존 감사합니다! 나는 그것을 시도 할 것이다. – Irisheyes169