SQL 分组依据。不同城市的重复latlng

Posted

技术标签:

【中文标题】SQL 分组依据。不同城市的重复latlng【英文标题】:SQL Group By. Duplicate lat/lng in differents cities 【发布时间】:2015-03-19 20:15:25 【问题描述】:

我很久以前购买了一个地理数据库,我正在将其精度更新为 lat/lng 值。但是我发现了一些奇怪的东西。有些城市具有相同的纬度/经度坐标。地理上不可能的事情。

id   City    State   Lat    Lng
1     A        sA     XX     XX
2     B        sA     XX     XX
3     C        sA     YY     YY
4     D        sA     ZZ     ZZ

所以我尝试了 Group By City, Lat, Lng,但由于我需要 id 来更新记录,group by 子句会要求我添加“id”列。

应该更新表中的 1 和 2,留下 3 和 4。它不应该是 2 个(或更多)具有相同纬度/经度的城市。该表有 22K 行。我可以将所有内容发送到 gmap API,但我正在寻找尽可能智能地使用 API 的时间、带宽和命中率,但考虑到我可以使用免费的 API 访问每秒发出一个请求,我的时间已经不多了。

我试过了

    SELECT DISTINCT postcodes_id, Latitude, Longitude, Region1Name, Region2Name, Nation_D
      FROM postcodes
      where Latitude + Longitude  IN 
      (
             SELECT Latitude + Longitude
             FROM
             (  
                        SELECT postcodes_id, Latitude, Longitude, count(distinct(Region2Name))  as cantidad 
                        FROM postcodes
                        where Nation_D is not null
                        GROUP BY Latitude, Longitude
                        having count(distinct(Region2Name)) > 1
             ) A
      )
      AND Nation_D IS NOT NULL

  ORDER BY  Latitude, Longitude, Region1Name, Region2Name, Nation_D

但没有按预期工作。我认为这对于一双新眼睛来说非常明显。

我编写了一个 python 脚本来使用 Google Map 地理编码来获取当前的 Lat/Lng 并在它不同时更新它。这个脚本工作正常。

希望有人有想法。谢谢!!

在 CentOS 7 上运行 mysql 5.5 和 Python 2.7。

【问题讨论】:

【参考方案1】:

只是给你一些建议,可能会有所帮助:

    您不应在纬度/经度或它们的任何组合上使用group bydistinct,因为它们是连续的浮点数,而不是离散的整数或字符串。

    出于同样的原因,您不应在纬度/经度或其总和上使用 WHERE 子句。如果您要检查两个位置是否接近,请改用st_distance() 函数。

    多个城市名称可以引用同一个位置。例如,纽约州纽约市和纽约州曼哈顿市。

还有一个非技术点:将 Google 地理编码数据存储在您的数据库中违反了他们的许可协议。

【讨论】:

以上是关于SQL 分组依据。不同城市的重复latlng的主要内容,如果未能解决你的问题,请参考以下文章

分组依据创建重复行

PostgreSQL选择最大值与分组依据和附加值[重复]

新列的 SQL 不同分组依据

尽管对所有关键变量进行了分组,SQL 还是重复?

groupby 并获得出现率最高的熊猫条目[重复]

sql 获取分组第一行数据