gpt4 book ai didi

ruby-on-rails - 从 Rails postgres 数据库中删除重复项

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:01 25 4
gpt4 key购买 nike

我有一个使用 Rails 应用程序创建的本地 PostgreSQL 数据库。它有 60 万条记录,其中约 20 万条是重复的。我只想保留一条记录并删除重复项。我每天都为工作编写 SQL,但 Rails 是我的爱好,但我仍然在与 ActiveRecord 作斗争。

这是我找到重复项的方法(在 Rails 控制台中):

Summary.select(:map_id).group(:map_id).having("count(*) > 1")

我不认为我可以简单地将 destroy_all 添加到该语句的末尾,因为它会销毁该条目的所有实例,包括重复值。

你能告诉我如何更新它以删除重复项吗?

最佳答案

这将销毁 waves 中的重复项,每次通过时,每个 map_id 只选择一个重复项。当不再存在重复项时,循环将自动结束。

loop do
duplicates = Summary.select("MAX(id) as id, map_id").group(:map_id).having("count(*) > 1")
break if duplicates.length == 0
duplicates.destroy_all
end

如果数据库是这样的:

| id | map_id |
| 1 | 235 |
| 2 | 299 |
| 3 | 324 |
| 4 | 235 |
| 5 | 235 |
| 6 | 299 |
| 7 | 235 |
| 8 | 324 |
| 9 | 299 |

在第一波中,这些记录将被归还并销毁:

| id | map_id |
| 7 | 235 |
| 8 | 324 |
| 9 | 299 |

在第二波中,这条记录将被归还并销毁:

| id | map_id |
| 5 | 235 |
| 6 | 299 |

第三波会回来并摧毁这个记录:

| id | map_id |
| 4 | 235 |

第四波将完成该过程。除非给定的 map_id 有大量重复项,否则此过程很可能会以一位数的循环迭代完成。

根据该方法,只会返回重复项,并且只会删除较新 的重复项。要删除旧的重复项,查询可以改为:

  duplicates = Summary.select("MIN(id) as id, map_id").group(:map_id).having("count(*) > 1")

在那种情况下,第 1 波会返回并摧毁:

| id | map_id |
| 1 | 235 |
| 2 | 299 |
| 3 | 324 |

第 2 波会返回并摧毁:

| id | map_id |
| 4 | 235 |
| 6 | 299 |

第 3 波会返回并摧毁:

| id | map_id |
| 5 | 235 |

第 4 波将完成该过程。

关于ruby-on-rails - 从 Rails postgres 数据库中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37514796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com