Ruby on rails 试图删除数据库中的重复项,但获取的id为零

Ruby on rails 试图删除数据库中的重复项,但获取的id为零,ruby-on-rails,ruby,postgresql,Ruby On Rails,Ruby,Postgresql,我正在使用rails find_by_sql查询来查找重复的条目,但删除它们的过程非常困难,因为该查询返回的数组的ID列为nil LogEntry.find_by_sqlSELECT date,atternate_id,count*作为日志条目组中的数量by date,atternate_id的count*>1 这将返回以下数组: [, , ] 当我尝试添加.each&:destroy时,它无法销毁它,因为正如您所看到的,ID被列为nil。我不明白这怎么可能?条目应该能够在没有ID的表中存在。我

我正在使用rails find_by_sql查询来查找重复的条目,但删除它们的过程非常困难,因为该查询返回的数组的ID列为nil

LogEntry.find_by_sqlSELECT date,atternate_id,count*作为日志条目组中的数量by date,atternate_id的count*>1 这将返回以下数组:

[, , ] 当我尝试添加.each&:destroy时,它无法销毁它,因为正如您所看到的,ID被列为nil。我不明白这怎么可能?条目应该能够在没有ID的表中存在。我的sql查询有问题吗


谢谢

在@engineersmnky的评论后更新了答案谢谢,错过了分组

为了删除重复项,必须获取重复行的ID。对于每个副本,您将需要N-1个ID,因为应该留下一个ID

要获取具有多个ID并因此具有重复ID的每个组的所有ID,请执行以下操作:

SELECT array_agg(id) FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1
让我们省略每组中的第一个ID:

SELECT (array_agg(id))[2:] FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1
接下来,我们需要取消对它们的测试,以便获得一个只包含要删除的ID的列表:

SELECT unnest((array_agg(id))[2:]) FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1
现在,为了在Rails中加载这些,一个简单的.where。。当ID位于上述构造的结果集中时,就足够了:

LogEntry.where('id IN (SELECT unnest((array_agg(id))[2:]) FROM log_entries GROUP BY date, athlete_id HAVING count(*) > 1)')
原始答复:

您的选择没有选择id。请将id添加到查询中,它应该可以工作:

LogEntry.find_by_sql("SELECT id, date, athlete_id, count(*) as qty FROM log_entries GROUP BY date, athlete_id HAVING count(*)> 1")

您可以将该查询写入日志条目。选择“id、日期、运动员id、计数*为数量”。组:日期,:运动员id。具有“计数*>1”。您不能选择id以这种方式查找重复项。这必须是多个查询,因为id将使行唯一,因此id必须是聚合函数的一部分,而聚合函数不能满足这一点。@engineersmnky感谢您指出这一点。我已经相应地更新了答案。