查找任何3个常用属性的重复记录

时间:2015-07-29 06:09:32

标签: sql ruby-on-rails ruby rails-activerecord

在我的RoR项目中,有一个包含10个属性的Customer模型。现在我想找到那些至少有三个共同属性的客户。如何有效地进行此查询?

可能它是一个解决方案:

Customer.select([:first_name,:last_name,:language]).
         group(:first_name,:last_name,:language).having("count(*) > 1")

但是这个解决方案需要太多的组合来检查。请帮助提供更好的解决方案。

谢谢!提前。

1 个答案:

答案 0 :(得分:0)

这是迄今为止我能想到的最好的。也不是SQL解决方案。

# Arrange a 3-items combination of columns, removed id and timestamps
triplets = Customer.column_names.reject {|column| column == "id" || column == "created_at" || column == "updated_at"}.combination(3).to_a

#Group All records by same item values for each 3-items combination
all = Customer.all
res = triplets.map do|t| 
  all.to_a.group_by {|c| [ {t[0] => c.send(t[0].to_sym)}, { t[1] => c.send(t[1].to_sym) }, {t[2] => c.send(t[2].to_sym)} ]} 
end  
# removed combinations with only 1 record
final_result = res.map {|h1| h1.reject { |k, v| v.count <= 1}}

# There you have customer with 3 attributes common combinations