【问题标题】:SQL Geography data type column in GROUP BY clauseGROUP BY 子句中的 SQL 地理数据类型列
【发布时间】:2012-04-24 16:06:03
【问题描述】:

我正在使用 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,因为它在地理数据类型中是必需的。

【问题讨论】:

    标签: sql sql-server tsql group-by sqlgeography


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      如果您想继续使用 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()
      

      【讨论】:

      • STAsBinary() 也可以
      猜你喜欢
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      相关资源
      最近更新 更多