SQL 分组依据。在不同的城市重复 lat/lng
SQL Group By. Duplicate lat/lng in differents cities
很久以前我买了一个地理数据库,我正在将其精度更新为 lat/lng 值。但是我发现了一些奇怪的东西。有些城市具有相同的 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
所以我尝试了按城市、纬度、经度分组,但由于我需要 id 来更新记录,因此分组子句会要求我添加“id”列。
从 table 开始,ids 1 和 2 应该被更新,留下 3 和 4。它不应该是 2 个(或更多)具有相同 Lat/Lng 的城市。 Table 有 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 地图地理编码来获取当前 Lat/Lng 并在不同时更新它。这个脚本工作正常。
希望有人有想法。谢谢!!
运行 MySQL 5.5 和 Python 2.7 在 CentOS 7 上。
给你一些建议,可能会有帮助:
您不应在 lat/lon 上使用 group by
或 distinct
或它们的任何组合,因为它们是连续的浮点数,而不是离散的整数或字符串.
出于同样的原因,您不应在 lat/lon 或其总和上使用 WHERE 子句。如果您要检查两个位置的接近度,请改用 st_distance()
函数。
多个城市名称可以指代同一个位置。例如,纽约州纽约市和纽约州曼哈顿市。
还有一个非技术要点:在您的数据库中存储 Google 地理编码数据违反了他们的许可协议。
很久以前我买了一个地理数据库,我正在将其精度更新为 lat/lng 值。但是我发现了一些奇怪的东西。有些城市具有相同的 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
所以我尝试了按城市、纬度、经度分组,但由于我需要 id 来更新记录,因此分组子句会要求我添加“id”列。
从 table 开始,ids 1 和 2 应该被更新,留下 3 和 4。它不应该是 2 个(或更多)具有相同 Lat/Lng 的城市。 Table 有 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 地图地理编码来获取当前 Lat/Lng 并在不同时更新它。这个脚本工作正常。
希望有人有想法。谢谢!!
运行 MySQL 5.5 和 Python 2.7 在 CentOS 7 上。
给你一些建议,可能会有帮助:
您不应在 lat/lon 上使用
group by
或distinct
或它们的任何组合,因为它们是连续的浮点数,而不是离散的整数或字符串.出于同样的原因,您不应在 lat/lon 或其总和上使用 WHERE 子句。如果您要检查两个位置的接近度,请改用
st_distance()
函数。多个城市名称可以指代同一个位置。例如,纽约州纽约市和纽约州曼哈顿市。
还有一个非技术要点:在您的数据库中存储 Google 地理编码数据违反了他们的许可协议。