У меня есть три таблицы (t1, t2, t3), каждая из которых содержит id, lat, lng.
Есть возможные дублирующие записи, которые я хочу идентифицировать и, возможно, устранить (если они действительно дублируют). Проблема в том, что значения lat и lng могут не совпадать с EXACT, поэтому типичный метод count (*)> 1 для поиска дубликатов не будет работать, так как я хочу учесть небольшую дисперсию геолокации (скажем, 250 футов или около 0,005 градусов в каждом широта и долгота) в любом заданном направлении.
Я нашел подобный вопрос здесь, но он не идентифицирует эту точную проблему, и я не смог экстраполировать этот код для моего ответа:
Все широты Lng таблицы sql в пределах 15 км от каждой широты Lng другой таблицы-sql 2008
Я нашел какой-то код, который работает для идентификации EXACT дубликатов lat / lng, но он не говорит мне, в каких таблицах находятся дубликаты, так что я могу вручную исследовать их или учесть даже малейшее отклонение в lat / lng и только возвращает один id, lat, lng и count для каждого дубликата.
Могут быть «дубликаты» с широтами 32,333 и 32,336, но приведенный ниже код не будет учитывать их, поскольку он будет видеть их как уникальные.
`SELECT id, lat, lng, COUNT( * )
FROM (
SELECT id, lat, lng
FROM t1
UNION ALL
SELECT id, lat, lng
FROM t2
UNION ALL
SELECT id, lat, lng
FROM t3
) tbl
GROUP BY lat, lng
HAVING COUNT( * ) >1
ORDER BY lat;`
В идеале вывод должен выглядеть примерно так:
`t1.id t2.id t3.id
432 1087 <-- found 2 rows within 250 of each other in t1 & t2
12 832 <-- found 2 rows within 250 of each other in t1 & t3
88 654 789<-- found 3 rows within 250 of each other in t1,t2&t3`
An example of "close duplicates" would be:
32.332, -87.556
32.336, -87.560