sql 删除重复的数据,保留一条,并且保留update_time最大的那条

近期面试的时候,考官出了一道题,当时没有做出来。第二天灵光乍现吧,写出来了,特此记录一下。

有一张表t,三个字段,自增id,name,update_time,删除name重复的行,保留update_time最大的那一条,只保留一条

DELETE
FROM
    t
WHERE
    t.`name` IN (
        SELECT
            t.`name`
        FROM
            (SELECT * FROM t) t
        GROUP BY
            t.`name`
        HAVING
            count(1) > 1
    )
AND t.id NOT IN (
    SELECT
        substring_index(max(t.new_u_time), ',', - 1)
    FROM
        (
            SELECT
                t.id,
                t.`name`,
                t.update_time,
                CONCAT(t.update_time, ',', t.id) new_u_time
            FROM
                t
        ) t
    GROUP BY
        t.`name`
    HAVING
        count(1) > 1
)



说明:如果是随便删除,保留一行,那大家应该都会,这里就是可能会出现update_time重复的情况,所以需要update_time和id concat 起来,然后取最大值,这样就不会重复了

猜你喜欢

转载自www.cnblogs.com/theone67/p/12515666.html