2014-07-09 2 views
0

평균을 얻고 항목 위치로 지정하기 위해 여러 지리 지점의 평균을 사용했습니다. 이제이 데이터를 추적해야하고 나머지 부분과 너무 멀리 떨어져있는 원래 점을 어떻게 든 식별해야합니다. 나는 STDistance를 사용할 필요가 있지만 그것을 올바르게 수행 할 필요가 있다고 생각한다. 루프를 통과하고 모든 점을 서로 비교해야하는 2 개의 커서가 필요할 것이다.여러 지리 값 사이의 거리

예제가 명확히하는 데 도움이되는 경우 : 항목의 대략적인 지역에있을 때마다 버튼을 눌러 GPS 좌표가 기록 될 때마다 사용자에게 GPS 좌표를 잠글 필요가있었습니다 . 그런 다음 5 개를 가져 와서 항목의 위치를 ​​AVG (Location.Lat) + AVG (Location.Long)로 설정했습니다. 이러한 사용자 프레스 중 하나가 멀리 떨어져 평균을 버려서 이제는 이들 중 하나를 식별해야 할 때 문제가 발생합니다.

SQL에서이 작업을 수행하는 올바른/효율적인 방법에 대한 아이디어가 있습니까? (항목 당 2 개의 커서를 통해 루핑하면 데이터베이스가 손상 될 수 있으므로 수백만 항목을 처리해야합니다.)

+0

SQL2008은 공간 함수를 지원하지 않는다고 생각합니다. 또한 공간 인덱스를 만들면 쿼리 속도에 많은 도움이됩니다. – leppie

답변

2

통계적으로 중요하지 않은 데이터를 버리는 것은 사람에게는 쉽지만 컴퓨터에서는 조금 번거로울 수 있습니다. 이것은 당신이 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의 창에서 위의 쿼리를 실행할 경우, 단순 평균이 모드보다 상당히 다르다는 것을 볼 수 + 평균 방법.

이 방법은 세트 기반 방법이기 때문에 루핑/커서 방식보다 상당히 빠릅니다.

+0

이 메서드는 모든 버전의 SQL Server에서 작동 할 것이라고 언급해야합니다. –

+0

와우, 꽤 포괄적 인 답변! 나는 그걸로 놀아 볼게요. – KrustyGString

+0

원본 문제에 대해 더 간단한 논리를 사용하기로 결정했지만 이와 비슷한 것을 사용하고 있으며 잘 작동합니다. 다시 한번 감사드립니다. – KrustyGString