2012-04-12 3 views
3

SQL Server를 사용하고 데이터베이스에서 작업자의 지리적 위치를 가져올 스크립트를 만듭니다. 스크립트는 다음과 같습니다. GROUP BY 절에있는 SQL Geography 데이터 형식 열

SELECT w.display_name, w.geo_location 
FROM jobs j WITH(NOLOCK) 
INNER JOIN workers w WITH(NOLOCK) ON w.worker_id = j.worker_id 
WHERE ..... 

문제

내가 표시되는 중복 레코드 있기 때문에 스크립트에 GROUP BY w.display_name, w.geo_location를 추가 할 것입니다. group by 절에 데이터 유형 geography가있는 열을 추가하면 오류가 발생합니다.

나는이에이 추가 할 때 오류가 발생되는 :

유형 "지리"는 비교할 수 없습니다. GROUP BY 절에는 사용할 수 없습니다.

이 방법이 있습니까? 지리 데이터 유형에 필요하므로 w.geo_locationVARCHAR으로 변환 할 수 없습니다.

답변

4

row_number()과 같은 것을 사용할 수 있습니다.

declare @g geography; 
set @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326); 

declare @T table 
(display_name varchar(10), geo_location geography) 

insert into @T values ('1', @g) 
insert into @T values ('1', @g) 
insert into @T values ('1', @g) 

insert into @T values ('2', @g) 
insert into @T values ('2', @g) 

select display_name, geo_location 
from 
    (
    select *, 
      row_number() over(partition by display_name, geo_location.ToString() order by (select 0)) as rn 
    from @T 
) as T 
where rn = 1 

결과 :

display_name geo_location 
------------ -------------------------------------------------------------------------------- 
1   0xE610000001148716D9CEF7D34740D7A3703D0A975EC08716D9CEF7D34740CBA145B6F3955EC0 
2   0xE610000001148716D9CEF7D34740D7A3703D0A975EC08716D9CEF7D34740CBA145B6F3955EC0 
4

당신이 다시 지리 텍스트를 열 및 변환 할 수 있습니다 구문으로 그룹을 계속 사용할 경우

SELECT w.display_name, geography::STGeomFromText(w.geo_location.STAsText(), 4326) as Location 
FROM jobs j WITH(NOLOCK) 
INNER JOIN workers w WITH(NOLOCK) ON w.worker_id = j.worker_id 
WHERE ..... 
GROUP BY w.display_name, w.geo_location.STAsText()