통계적으로 중요하지 않은 데이터를 버리는 것은 사람에게는 쉽지만 컴퓨터에서는 조금 번거로울 수 있습니다. 이것은 당신이 2 차원 (위도와 경도)을 다루고 있기 때문에 특히 상황에 해당됩니다.
나는 몇 년 전에 내가 쓴이 블로그를 보길 제안한다 : Calculating Mean Median and Mode With SQL Server.
위도 및 경도는 소수점 이하의 각 숫자가 거리를 나타냅니다. 당신이 할 수있는 것은 위도와 경도를 소수점 이하의 특정 숫자로 반올림하고 모드를 찾는 것입니다. 모드와 다른 점을 제거한 다음 나머지 반올림되지 않은 항목의 평균을 구하십시오.
2 차원으로 작업하고 있으므로 위도가 경도가 아니라도 벗어날 수 있으므로 위도와 경도 값을 별도로 지정해야합니다 (북쪽 또는 남쪽의 나쁜 지점을 나타냄). 실제 위치의). 위도가 명백하게 ok 인 동안 똑같이, 경도는 벗어난 길일 수 있었다. 두 값 중 하나라도 "나쁘다"면 포인트를 완전히 버려야합니다. 여기
이의 예입니다 내가 무엇에 대해 이야기하고 :
Declare @Temp Table(Lat Decimal(9,6), Lon Decimal(9,6))
Insert Into @Temp Values(20.12341, 10.98731)
Insert Into @Temp Values(20.12342, 10.98732)
Insert Into @Temp Values(20.12343, 10.98733)
Insert Into @Temp Values(20.12344, 10.98734)
Insert Into @Temp Values(20.12344, 10.68734) -- Latitude OK, Longitude bad
Insert Into @Temp Values(20.32344, 10.98734) -- Longitude OK, Latitude bad
Insert Into @Temp Values(20.42340, 10.68730) -- Both are bad
Select Avg(Lat), Avg(Lon)
From @Temp
Select Avg(T.Lat) As Latitude,
Avg(T.Lon) As Longitude
From @Temp T
Inner Join (
-- Calculate the mode for the latitude
Select Top 1 Convert(Decimal(9,4), Lat) As ModeOfLat
From @Temp
Group By Convert(Decimal(9,4), Lat)
Order By Count(*) DESC
) As Latitudes
On Convert(Decimal(9,4), Lat) = Latitudes.ModeOfLat
Inner Join (
-- Calculate the mode for the longitude
Select Top 1 Convert(Decimal(9,4), Lon) As ModeOfLon
From @Temp
Group By Convert(Decimal(9,4), Lon)
Order By Count(*) DESC
) As Longitudes
On Convert(Decimal(9,4), Lon) = Longitudes.ModeOfLon
당신은 SQL Server Management Studio의 창에서 위의 쿼리를 실행할 경우, 단순 평균이 모드보다 상당히 다르다는 것을 볼 수 + 평균 방법.
이 방법은 세트 기반 방법이기 때문에 루핑/커서 방식보다 상당히 빠릅니다.
SQL2008은 공간 함수를 지원하지 않는다고 생각합니다. 또한 공간 인덱스를 만들면 쿼리 속도에 많은 도움이됩니다. – leppie