2012-01-09 2 views
2

У меня есть таблица с широтой и долготой столбцов. В большинстве случаев значение проходит мимо десятичного знака: -81.7770051972473 в редких случаях значение такое: -81.77 для некоторых записей.удалить дубликаты в базе данных mysql

Как найти дубликаты и удалить один из дубликатов только для записей, которые выходят за пределы двух знаков после запятой?

ответ

1

Используя некоторые творческие substring, float и charindex логика, я пришел до

delete l1 
from 
    latlong l1 
    inner join (
     select 
      id, 
      substring(cast(latitude as varchar), 0, INSTR(CAST(latitude as varchar))+3, '.') as truncatedLat 
     from 
      latlong 
    ) l2 on 
     l1.id <> l2.id 
     and l1.latitude = cast(l2.truncatedLat as float) 

До бегите, попробуйте select * вместо delete l1, чтобы убедиться, что вы удаляете правильные строки.

Следует отметить, что это работало на SQL Server с использованием функций, которые, как я знаю, существуют в MySQL, но я не смог их протестировать против экземпляра MySQL, поэтому может потребоваться небольшая настройка, которая должна быть выполнена. Например, в SQL Server я использовал charindex вместо instr, но оба они должны работать аналогичным образом.

1

Не знаете, как это сделать только в SQL.

Я использовал языки сценариев, такие как PHP или CFML, для решения подобных задач, построив запрос, чтобы вытащить записи, затем перейдя по набору записей и выполняя некоторое сравнение. Если true, то ОЧЕНЬ ТЩАТЕЛЬНО вызовите другую функцию, передав идентификатор записи и удалив запись. Я бы, вероятно, даже оставил запись в таблице, но отметьте другой столбец как isDeleted.

Если вы более амбициозны, чем я, похоже, эта нить близко к тому, что вы хотите

Deleting Duplicates in MySQL

finding multi column duplicates mysql

1

Использование внешнего языка программирования (Perl, PHP, Java, сборка ...):

  • Выберите * из базы данных
  • Для каждой строки выберите * из базы данных, где newLat> = круглый (oldLat , 2) и newLat < round (oldLat, 2) + .01 и // одинаковые критерии для долготы
  • Сохраните один из них на основе любых критериев, которые вы выберете. Если самый младший первичный ключ, сортируйте по нему и пропустите первый результат.
  • Удалить все остальное.
  • Повторите этот шаг для всех записей, которые вы уже удалили.

Если по какой-то причине вы хотите, чтобы определить, все с более чем 2 цифр точности:

select * from database where lat != round(lat,2), or long != round(long,2) 
Смежные вопросы