跳过第一条重复记录并更新其他记录

Posted

技术标签:

【中文标题】跳过第一条重复记录并更新其他记录【英文标题】:skip first duplicate record and update others 【发布时间】:2018-11-20 16:54:37 【问题描述】:

查询1:检查是否存在重复记录:

SELECT
    id , username, COUNT(*)
FROM
   tbluser
GROUP BY
   username
HAVING 
    COUNT(*) > 1;

结果:

查询 2:针对一个数据集监控重复记录。

select * from tbluser where username = 'abcuser1';

结果:

查询 3:(基于查询 2 中的数据,跳过第一条记录,即 293 并更新所有其他重复事件的状态。

我目前的方法:

    SELECT CONCAT(id , ',') 
FROM    tbluser u1
WHERE   EXISTS
        (
        SELECT  1
        FROM    tbluser u2
        WHERE   u1.username = u2.username and u1.status = u2.status = 1 and u1.appId = u2.appId 
        LIMIT 1, 1
        )
        limit 1, 18446744073709551615

上面的查询给了我需要更新状态的重复记录的 ID。然后我将上面的结果 id 粘贴到:

update tbluser set status = 0 where id in (1,2);

查询 3 没有给出想要的结果。它只是跳过第一条记录并给出所有数据集的所有其他重复记录。

如何跳过每个数据集中的第一条重复记录?

【问题讨论】:

【参考方案1】:

这是一种方式:

UPDATE tbluser t
JOIN (
   SELECT username, MIN(id) AS min_id
   FROM tbluser
   GROUP BY username
) AS g ON t.username = g.username AND t.id <> min_id
SET status = 0;

上述查询会更新所有id 值大于username 切片中的最小值id 的记录。

Demo here

【讨论】:

以上是关于跳过第一条重复记录并更新其他记录的主要内容,如果未能解决你的问题,请参考以下文章

怎么删除ACCESS中的重复记录 只保留一条

For循环不打印游标中的最后一条记录

MySql根据字段名查询重复记录并删除!只保留一条

更新 SQL Server 表中除一条重复记录外的所有重复记录

选择基于重复项的第一条记录[重复]

将第一条记录的单列与 SQL Server 中的重复记录合并