首页 > 解决方案 > 根据时间戳仅保留用户的最后 N 条记录

问题描述

我有一张这样的表格,用于用户最近的图书搜索。我只需要为用户维护最后 3 条记录。假设在下表中,我们为用户 123 提供了 3 个条目,如果有类似的新条目进入123, DEF, 2020-11-28 21:08:39,我应该插入这个并根据时间戳删除最后一个条目,即表中的第二个条目。实现这一目标的最佳方法是什么?这可以在一个数据库调用中完成吗?还是我需要先插入,检查一个用户的计数是否大于3,然后删除最旧的?

+------------+-------------+---------------------+
| User Id    | Book Name   | Last Searched       |
+------------+-------------+---------------------+
| 123        | ABC         | 2020-10-09 23:10:36 |
| 123        | XYZ         | 2020-10-08 21:08:39 |
| 123        | PRO         | 2020-11-27 02:32:26 |
| 456        | XYZ         | 2020-09-11 11:41:19 |
| 456        | PRO         | 2020-10-03 22:09:42 |
+------------+-------------+---------------------+

标签: sqloracle

解决方案


您可以尝试的一件事是创建一个AFTER STATEMENT触发器并在其中运行以下查询:

CREATE OR REPLACE TRIGGER ai_some_table_old
AFTER INSERT ON some_table
BEGIN
  DELETE FROM some_table st
  WHERE st.rowid IN (SELECT s.row_id
                     FROM (SELECT ROWID AS ROW_ID, 
                                  DENSE_RANK() OVER (PARTITION BY s.user_id ORDER BY s.last_searched DESC) AS REC_RANK
                           FROM some_table s) s
                     WHERE s.rec_rank > 3);
END;
/

这是一个 DB Fiddle 向您展示整个过程(链接

如果您真的想变得棘手......或者如果性能DELETE很差,您可以创建一个COMPOUND TRIGGER基于作为语句一部分触及的记录来限制 USER_ID 列。


推荐阅读