根据坐标接近度删除 "almost duplicate" 行

Delete "almost duplicate" rows based on coordinate proximity

我有一个 table,其中包含城镇、自治市、县和坐标的名称。不幸的是,有些城镇“几乎重复”,即在第一行附近有另一行具有相同的名称、自治市、县和坐标。有些甚至有不止一个“几乎重复”。

如何删除除其中一种行之外的所有行?

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

示例数据

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    

可以在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