在GROUP SQL地理数据类型列BY子句(SQL Geography data type colu

2019-09-16 12:07发布

我使用的是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的脚本有被显示重复的记录。 通过加入条款与数据类型地理列一组导致引发错误。

当我添加这是抛出的错误:

该类型的“地理”是不具有可比性。 它不能在GROUP BY子句中使用。

有没有解决的办法? 我不能转换w.geo_locationVARCHAR ,因为它需要在地理数据类型。

Answer 1:

您可以使用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


Answer 2:

如果你想继续语法使用该团体,您可以转换地理列文本,然后再返回:

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()


文章来源: SQL Geography data type column in GROUP BY clause