You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术需求:删除表中重复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:20:18