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_locationVARCHAR地理数据类型中需要的 a 。

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 回答