2012-04-12 33 views
3

我正在使用SQL Server並創建一個腳本,該腳本將獲取我的數據庫中的工作人員地理位置。腳本如下。GROUP BY子句中的SQL地理數據類型列

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

你可以使用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()