如何在单个表中删除每个用户的除最后100条之外的所有日志?

时间:2019-06-27 06:05:15

标签: ruby-on-rails postgresql activerecord

我有一个日志表,其中包含用户条目。我想要(删节)删除每个用户的所有内容,但最后100个除外。我想以最有效的方式做到这一点(如果可能的话,使用ActiveRecord一条语句)。

我知道我可以使用以下内容:

  • .order(created_at: :desc)对记录进行排序
  • .offset(100)获取除我要保留的记录以外的所有记录
  • .ids提取记录ID
  • select(:user_id).distinct获取表中所有用户的列表

该表具有iduser_idcreated_at列(以及其他与该问题无关的列)。

每个用户至少应有剩余的100条日志条目。

我不太确定如何在我的Log模型中使用ruby语法来做到这一点。如果无法使用ruby有效地完成此任务,那么我将求助于使用SQL等效项。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在SQL中,您可以这样做:

DELETE FROM logs
USING (SELECT id
       FROM (SELECT id,
                    row_number()
                       OVER (PARTITION BY user_id
                             ORDER BY created_at DESC)
                       AS rownr
             FROM logs
            ) AS a
       WHERE rownr > 100
      ) AS b
WHERE logs.id = b.id;

如果表很大,那会很慢。