根据坐标接近度删除 "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
由于2
与1
具有相同的名称、市和县,并且在1
的纬度和经度上都在0.005
十进制度内,所以它是被认为是重复的,应该被删除。
另一方面,3
不在 1
的 0.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。
我有一个 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
由于2
与1
具有相同的名称、市和县,并且在1
的纬度和经度上都在0.005
十进制度内,所以它是被认为是重复的,应该被删除。
另一方面,3
不在 1
的 0.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。