Если это одноразовая вещь, то я просто делаю это в Ruby и не слишком беспокоюсь об эффективности. Я не проверил это полностью, проверил сортировку и тому подобное, чтобы убедиться, что она будет делать именно то, что вы хотите, прежде чем запускать это на своей базе данных:)
keep = []
locations = Location.find(:all)
locations.each do |loc|
# get all Locations's with the same coords as this one
same_coords = locations.select { |l| l.lat == loc.lat and \
l.lng == loc.lng }
with_urls = same_coords.select { |l| !l.url.empty? }
# decide which list to use depending if there were any urls
same_coords = with_urls.any? ? with_urls : same_coords
# pick the best one
keep << same_coords.sort { |a,b| b.created_at <=> a.created_at }.first.id
end
# only keep unique ids
keep.uniq!
# now we just delete all the rows we didn't decide to keep
locations.each do |loc|
loc.destroy unless keep.include?( loc.id )
end
Теперь, как я уже сказал, это определенно плохой, плохой код. Но иногда просто взломать то, что работает, стоит потраченного времени на то, чтобы придумать что-то «лучше», особенно если это разовое.