如果特定日期有多条记录,我想删除当天除最新记录以外的所有记录。例如,在下面的表中,id为9,10,12的记录具有相同的日期。所以9和10应该被删除,因为id为12的记录具有最新日期。
id date
1 2012-04-25 00:00:00.000000
2 2012-04-26 00:00:00.000000
3 2012-04-23 00:00:00.000000
4 2012-04-24 00:00:00.000000
5 2012-05-01 00:00:00.000000
6 2012-05-02 00:00:00.000000
7 2012-05-03 00:00:00.000000
8 2012-05-04 00:00:00.000000
9 2012-04-30 00:30:00.000000
10 2012-04-30 18:00:00.000000
11 2012-04-29 00:00:00.000000
12 2012-04-30 18:40:00.000000
13 2012-05-05 00:00:00.000000
14 2012-05-05 09:31:31.000000
这是(脏)rake任务删除重复项
task :remove_duplicate do
Rake::Task["remove_duplicate"].invoke
end
task :remove_duplicate => :environment do
weights = Weight.count(:group => "DATE(date)", :having => "COUNT(id) > 1")
weights_to_delete = []
weights.each do |weight|
start_date = weight[0].to_date.beginning_of_day
end_date = weight[0].to_date.end_of_day
day_weights = Weight.where("date >= ? and date <= ?", start_date, end_date).order(:date)
day_weights[0..-2].each do |weight|
weights_to_delete.push weight.id
end
end
Weight.delete(weights_to_delete)
end
虽然我能够按照我的解释删除记录,但我对我采取的方法不满意。请指导我删除特定日期的重复记录,仅使用ActiveRecord API更好地保留最新记录。
谢谢,Amit Patel
答案 0 :(得分:4)
这种方法可能很慢,所以我不推荐它,除非你定期运行它。
Weight.all.each do |weight|
Weight.order("id desc").where(date: weight.date).all.drop(1).each { |w| w.delete }
end
答案 1 :(得分:0)
试试这个:
latest_daily_weights = (Weight.maximum :date, :group => 'DATE(date)').values
weights_table = Arel::Table.new(:weights)
earlier_daily_weights = Weight.where(weights_table[:date].not_in latest_daily_weights)
earlier_daily_weights.delete_all
信用:
How to exclude an array of ids from query in Rails (using ActiveRecord)?
答案 2 :(得分:0)
您可以尝试此sql查询,删除该日期相同日期但最新日期的记录
DELETE FROM weights USING weights weight WHERE (CAST(weights.date as Date) = CAST(weight.date as Date) AND weights.id < weight.id);