如何删除mySQL中的重复项?

时间:2019-02-09 15:05:48

标签: mysql sql mariadb

我是SQL初学者。 我在MariaDB中有一个包含以下字段的表
(我添加了具有自动递增功能的ID。)
enter image description here

现在,我需要删除具有相同DATE的行。
如果这是熊猫的数据框,则是一种解决方法,

    <header>
                <nav>
                  <div class = "navbar">
                    <div class = "logo"><h1>Rick Wilson</h1></div>
                    <div class = "links">
                    <a href="#">Experience</a>
                    <a href="#">Projects</a>
                    <a href="#">Technology Stack</a>
                    <a href="#">Contact</a>
                    </div>
                  </div> 
                </nav>
                  </header>

如何在SQL中执行此操作?

样本数据

df = df.drop_duplicates ()

所需数据

date/open/high/low/close/volume    
2019.02.04 00:00:00 13.34303    13.34303    13.34143    13.34303    4
2019.02.04 00:01:00 13.34303    13.34303    13.34303    13.34303    2
★ 2019.02.04 00:02:00   13.34303    13.34323    13.34303    13.34323    2
★2019.02.04 00:02:00    13.34303    13.34323    13.34303    13.34323    2
2019.02.04 00:04:00 13.33663    13.33743    13.33623    13.33733    86
2019.02.04 00:05:00 13.33734    13.33734    13.33613    13.33613    70

我的环境详细信息:

  

Windows版本:Home 64位
XAMPP版本:7.2.8控制面板
  版本:3.2.2 [编译:2015年11月12日]
  通过TCP / IP的127.0.0.1
未使用MariaDB SSL
  10.1.34-MariaDB-mariadb.org二进制分发协议版本:10
字符集:UTF-8 Unicode(utf8)

发表评论 enter image description here

对于已回答的命令
enter image description here

任何建议都值得赞赏!

2 个答案:

答案 0 :(得分:1)

如果要删除日期在表中多次出现的每条记录,可以按以下步骤操作:

DELETE t 
FROM mytable t
INNER JOIN (
    SELECT datetime FROM mytable GROUP BY datetime HAVING COUNT(*) > 1
) t1 ON t1.datetime = t.datetime;

Demo on DB Fiddle


在您的问题被编辑后,我了解到您要删除重复行中的一个,而保留另一行。

要实现此目的,您将需要一列来唯一标识重复项组中的每条记录。我们将该列称为id

DELETE t FROM mytable t
INNER JOIN mytable t1 ON t1.datetime = t.datetime AND t1.id < t.id;

Demo on DB Fiddle

答案 1 :(得分:0)

如果这与整行重复有关,我建议重新加载表。您可以为此使用临时表:

create table temp_t as
    select distinct *
    from t;

然后,您可以将其重新放回原始表中,如下所示:

truncate table t;

insert into t
    select * 
    from temp_t;

通常,我会在insert中包括所有列。但是对于这种类型的处理,代码使用select *来生成临时表,它只是重新插入到原始表中。

通过使用truncate / insert,您可以节省记录和锁定表的大量开销。