【问题标题】:Find and remove duplicate rows by two columns where one of those columns is a TIMEDATE查找并删除两列重复的行,其中一列是 TIMEDATE
【发布时间】:2021-02-21 06:07:54
【问题描述】:

我正在尝试通过表中的两列查找和删除重复行

一种推荐的解决方案是放置一个唯一索引,然后将其删除,如下所示:

ALTER IGNORE TABLE your_table ADD UNIQUE (field1,field2,field3);

(Find and remove duplicate rows by two columns)

其中一列是 DATETIME,我想使用它的日期部分作为“唯一”功能来删除重复项。我该怎么做?

例如:

[column1] [column2]
[2020-01-01 11:11:11] [john]
[2020-01-01 16:11:11] [john]
[2020-07-07 17:17:11] [mike]

我希望删除前 2 行之一,因为时间戳的日期部分(在第 1 列中)和名称(第 2 列)是相同的。

预期结果:

[column1] [column2]
[2020-01-01 11:11:11] [john]
[2020-07-07 17:17:11] [mike]

【问题讨论】:

  • 你有主键列吗?
  • 没有主键列

标签: mysql sql


【解决方案1】:

我们可以在这里使用存在逻辑:

DELETE
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable t2
              WHERE t2.column2 = t1.column2 AND
                    DATE(t2.column1) = DATE(t1.column1) AND
                    t2.column1 < t1.column1);

用简单的英语阅读,上面的查询表示删除任何我们可以找到另一个具有相同名称(column2 值)、相同日期但时间戳更早的记录的记录包括时间部分。对于具有最早时间戳值的给定名称,此存在检查将失败。

【讨论】:

    【解决方案2】:
    delete t1
    from your_table t1
    left join
    (
      select min(col1) mcol, col2
      from your_table
      group by col2
    ) tmp on t1.col1 = tmp.mcol 
         and t1.col2 = tmp.col2
    where tmp.col2 is null
    

    【讨论】:

      猜你喜欢
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 2018-01-15
      相关资源
      最近更新 更多