5

私は SQL Server を使用しており、データベースからワーカーの地理的な場所を取得するスクリプトを作成しています。スクリプトは以下です。

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問題は、重複したレコードが表示されているため、スクリプトに追加したいということです。データ型が geography の列を group by 句に追加すると、エラーがスローされます。

これを追加するとスローされるエラーは次のとおりです。

タイプ「地理」は比較できません。GROUP BY 句では使用できません。

これを回避する方法はありますか?地理データ型で必要なため、にw.geo_location変換できません。VARCHAR

4

2 に答える 2

7

group by 構文を引き続き使用する場合は、geo 列をテキストに変換し、再び元に戻すことができます。

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()
于 2013-10-14T13:56:58.617 に答える
6

このようなものを使用できます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
于 2012-04-12T11:09:40.253 に答える