【问题标题】:Delete "almost duplicate" rows based on coordinate proximity根据坐标接近度删除“几乎重复”的行
【发布时间】:2022-01-22 18:37:30
【问题描述】:

我有一张表,上面有城镇、市、县和坐标的名称。不幸的是,一些城镇有“几乎重复”,即存在另一行具有相同名称、市、县和坐标的非常接近第一行。有些甚至有不止一个“近似重复”。

我怎样才能删除除其中一种之外的所有行?

我知道我可以使用带有ROW_NUMBER() OVER(PARTITION BY name, municipality, county, latitude, longitude) 的 CTE 来删除完全重复的内容。但是我如何检查纬度和经度是否在0.005(= 大约 500-600 米,以十进制度为单位的纬度/经度)之内?

样本数据

ID  Name         Municipality   County  Lat         Lng
------------------------------------------------------------
1   Springfield  Simpsonville   Homer   12.34567    89.01234
2   Springfield  Simpsonville   Homer   12.35000    89.01200
3   Springfield  Simpsonville   Homer   12.00000    89.00000
4   AnotherTown  AnotherVille   Bart    12.34567    89.01234

由于21 同名、市和县,并且在1 的经纬度上都在0.005 十进制度内,因此它被认为是重复的,应该删除。 另一方面,3 不在10.005 十进制度范围内,因此它不应被视为1 的重复。

预期结果

ID  Name         Municipality   County  Lat         Lng
--------------------------------------------------------
1   Springfield  Simpsonville   Homer   12.34567    89.01234
3   Springfield  Simpsonville   Homer   12.00000    89.00000
4   AnotherTown  AnotherVille   Bart    12.34567    89.01234    

【问题讨论】:

  • 你如何计算接近度?发布示例数据和预期结果以阐明您想要什么。
  • 这能回答你的问题吗? MySQL Group By and bracketing according to age
  • 请提供样本数据和所需结果
  • @forpas 添加了示例数据和预期结果。请正确阅读问题,了解如何计算接近度。
  • @Stu 好了,现在您有了样本数据和预期结果。

标签: sql sqlite sql-delete exists


【解决方案1】:

您可以在DELETE 语句中使用EXISTS

DELETE FROM tablename AS t1
WHERE EXISTS (
  SELECT 1 
  FROM tablename t2
  WHERE (t2.Name, t2.Municipality, t2.County) = (t1.Name, t1.Municipality, t1.County)
    AND ABS(t2.Lat - t1.Lat) <= 0.005 AND ABS(t2.Lng - t1.Lng) <= 0.005
    AND t2.ID < t1.ID
);

请参阅demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2020-10-01
    • 2019-01-21
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多