2012-04-12 25 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()