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

如何删除SQL表中时间差仅1-2秒的近似重复记录

处理SQL表中时间相近的重复数据问题

我维护一个关联ISBN图书扫描应用的SQL表,由于扫描触发的函数被多次调用,表中产生了重复数据。已经清理了同一时间点插入的重复行(比如4行时间均为2024-03-21 02:35:11.000的记录),但发现存在时间差仅1-2秒的近似重复行,示例如下:

ID    | Date
30370 | 2024-03-21 02:35:11.000
30371 | 2024-03-21 02:35:12.000
30372 | 2024-03-21 02:35:14.000
30373 | 2024-03-21 02:35:15.000

请问如何删除这些近似重复行,仅保留一行?

以下是我之前用于删除完全重复行的SQL语句:

DELETE FROM <table>
WHERE Id NOT IN (
    SELECT MIN(ID)
    FROM <table>
    GROUP BY Date
)

解决方案

核心思路是把时间差在阈值内(比如2秒)的记录归为同一组,然后只保留每组中的一条记录(比如最小ID的那条)。

方法1:使用窗口函数(适用于MySQL 8+/PostgreSQL/SQL Server等支持窗口函数的数据库)

WITH grouped_records AS (
    SELECT 
        ID,
        Date,
        -- 将时间差超过2秒的记录划分为新组
        SUM(CASE WHEN TIMESTAMPDIFF(SECOND, LAG(Date) OVER (ORDER BY Date), Date) > 2 THEN 1 ELSE 0 END) 
            OVER (ORDER BY Date) AS group_id
    FROM <table>
)
DELETE FROM <table>
WHERE ID NOT IN (
    SELECT MIN(ID)
    FROM grouped_records
    GROUP BY group_id
);

方法2:自关联分组(兼容旧版数据库)

DELETE t1
FROM <table> t1
JOIN <table> t2 
    ON t2.Date BETWEEN DATE_SUB(t1.Date, INTERVAL 2 SECOND) AND t1.Date
    AND t2.ID < t1.ID;

注:该方法保留每组中ID最小的记录,删除所有时间在其前后2秒内且ID更大的近似重复行;若需保留最晚插入的记录,将t2.ID < t1.ID改为t2.ID > t1.ID即可。


内容的提问来源于stack exchange,提问作者Ale Yanczuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:10:01