技术需求:删除表中重复user_id,保留每个user_id最新5条数据
嘿,咱们来搞定这个「保留每个user_id最新5条记录、删掉旧重复数据」的需求~核心思路很清晰:先给每个用户的记录按日期字段(比如create_time)倒序分配行号,行号≤5的就是要保留的最新5条,行号>5的就是该清理的旧数据。下面分主流数据库给你具体实现方案:
核心逻辑拆解
先给同个user_id下的记录按日期从新到旧排序,给每条记录标上行号。只要筛选出行号≤5的记录,剩下的就是要删除的冗余数据。
分数据库实现代码
MySQL(5.7+ 支持窗口函数)
用ROW_NUMBER()窗口函数标记行号,通过CTE筛选要删除的记录:
WITH ranked_records AS ( SELECT id, -- 替换成你表的主键/唯一标识字段 user_id, create_time, -- 替换成你的日期字段 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_time DESC) AS row_num FROM your_table_name -- 替换成你的表名 ) DELETE FROM your_table_name WHERE id IN (SELECT id FROM ranked_records WHERE row_num > 5);
如果是MySQL 5.6及以下(不支持窗口函数),用变量模拟行号:
DELETE t1 FROM your_table_name t1 JOIN ( SELECT id, @row_num := IF(@prev_user = user_id, @row_num + 1, 1) AS row_num, @prev_user := user_id FROM your_table_name ORDER BY user_id, create_time DESC ) t2 ON t1.id = t2.id WHERE t2.row_num > 5;
PostgreSQL
PostgreSQL用CTE结合删除操作很丝滑,也可以用USING子句提升效率:
-- 方法1:CTE + IN子句 WITH ranked_records AS ( SELECT id, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_time DESC) AS row_num FROM your_table_name ) DELETE FROM your_table_name WHERE id IN (SELECT id FROM ranked_records WHERE row_num > 5); -- 方法2:USING子句(更高效) WITH ranked_records AS ( SELECT id, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_time DESC) AS row_num FROM your_table_name ) DELETE FROM your_table_name t USING ranked_records r WHERE t.id = r.id AND r.row_num > 5;
SQL Server
SQL Server可以直接删除CTE中符合条件的记录(因为CTE和原表关联):
WITH ranked_records AS ( SELECT id, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_time DESC) AS row_num FROM your_table_name ) DELETE FROM ranked_records WHERE row_num > 5;
重要注意事项
- 记得把代码里的
your_table_name、create_time、id替换成你表的实际字段/表名!如果没有主键,尽量用user_id+create_time这类唯一组合来标识记录,但还是建议表要有主键。 - **执行删除前一定要先验证!**把
DELETE语句改成SELECT,先看看要删除的记录是不是符合预期,比如把第一个MySQL例子改成SELECT * FROM your_table_name WHERE id IN (...)确认一遍。 - 如果存在同个
user_id多条记录日期完全相同的情况,ROW_NUMBER()会随机给这些记录排序。要是想保留所有同日期的记录(只要总数不超5),可以把ROW_NUMBER()换成RANK()或者DENSE_RANK(),按需调整。
内容的提问来源于stack exchange,提问作者robin
相关产品推荐
相关产品推荐

