sql - 根据时间戳仅保留用户的最后 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 |
+------------+-------------+---------------------+
解决方案
您可以尝试的一件事是创建一个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 列。
推荐阅读
- html - TOSCA - 试图引导表列内部 html 元素
- java - 使用其他文件的 Gradle exec python 文件:权限被拒绝
- java - Android Studio:软键盘向上推送内容
- sql - MongoDB BI 连接器是否支持 INSERT/UPDATE 操作?
- neo4j - Neo4j:如何在我的密码语句中实现 apoc.atomic.update?
- sql-server - SQL Server - 如果列不存在,则创建列
- sql - 查找多次出现
- c# - 从 Solidworks 将 .glb 文件导入 Unity
- python - 修复 matplotlib python 中不均匀的矩形补丁宽度
- c# - 即使表存在,SqlConnection.GetSchema("Tables") 也会返回 null