===============================================

2019/7/16_第1次修改                       ccb_warlock

===============================================

接着上一个话题(https://www.cnblogs.com/straycats/p/11198340.html),做完了表结构和表内容的备份后,接着就需要删除数据。

然而在删除数据的过程中发现,存在多条相同的业务数据记录到了数据库中(表现为,除了索引字段,其他所有字段的内容完全一致)。这样就导致原本的线性增加趋势更明显,脏数据不仅浪费了空间,更影响了查询的效率。

故还是通过sql语句的处理还删除那些逻辑上重复的数据。

daily_t表结构如下:

字段名 描述
TID 索引id
USER_ID 用户id
STATS_DATE 日期

查看要删除的重复记录(在删除数据前先做查询确认范围)

SELECT *
FROM daily_t
WHERE (USER_ID, STATS_DATE) IN (
SELECT *
FROM (SELECT USER_ID, STATS_DATE
FROM daily_t
GROUP BY USER_ID, STATS_DATE
HAVING count(*) > 1) A)
AND TID NOT IN (
SELECT *
FROM (SELECT min(TID)
FROM daily_t
GROUP BY USER_ID, STATS_DATE
HAVING count(*) > 1) B)
ORDER BY USER_ID, STATS_DATE;

删除重复的记录(只留有索引最小的记录)

DELETE
FROM daily_t
WHERE (USER_ID, STATS_DATE) IN (
SELECT *
FROM (SELECT USER_ID, STATS_DATE
FROM daily_t
GROUP BY USER_ID, STATS_DATE
HAVING count(*) > 1) A)
AND TID NOT IN (
SELECT *
FROM (SELECT min(TID)
FROM daily_t
GROUP BY USER_ID, STATS_DATE
HAVING count(*) > 1) B);

PS.sql语句中之所以对子查询多嵌套了一层(select *)是为了规避mysql不支持在where中进行针对需要删除操作的表的子查询(1093-You can’t specify target table for update in FROM clause),因为多嵌套了一层(select *)后,子查询内操作的是两张临时表A、B,而不是daily_t。

mysql 删除表中多余的重复记录的更多相关文章

  1. 删除Mysql数据表中多余的重复记录的sql语句

    数据表 sniper_tb 中存在主键 id,字段url,现需要在url字段上添加 unique,但由于url存在重复记录,导致添加失败. 如何删除表中多余的url重复记录,仅保持一条? 思路一 将 ...

  2. 删除表中多余的重复记录(多个字段),只留有rowid最小的记录

    假如表Users,其中ID为自增长. ID,Name,Sex 1 张三,男 2 张三,男 3 李四,女 4 李四,女 5 王五,男 --查找出最小行号ID的重复记录 select Name,Sex,C ...

  3. 删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录

    delete from Resource where Title in (select Title from Resource group by Title having count(Title) & ...

  4. SqlServer查找表中多余的重复记录

    1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from ...

  5. mysql 删除表中记录

    一.清除mysql表中数据 delete from 表名;truncate table 表名;不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以 ...

  6. mysql删除表中的记录

    大家都知道,在MySQL中删除一个表中的记录有两种方法,一种是DELETE FROM TABLENAME WHERE... , 还有一种是TRUNCATE TABLE TABLENAME. DELET ...

  7. PHP mysql 删除表中所有数据只保留一条

    DELETE FROM `logs` WHERE wangzhi='www.juhutang.com' and id<>101072; 上面这段代码的意思为 删除表logs中 所有字段wa ...

  8. mysql删除表中重复数据,只保留一个最小的id的记录

    语句: delete from table1 where id not in (select minid from (select min(id) as minid from table1 group ...

  9. MySQL 删除表中所有数据

    方法一:使用 delete from [表名]    生成日志 方法二:使用 truncate table [表名]    无日志生成 两种方式删除后再插入数据,第一条id的值不一样 方法一: 方法二 ...

随机推荐

  1. WebSocket专题(阿里)

    我们的项目中使用了websocket 用java-websocket 开源项目做的,阿里的人问我用啥实现的websocket一时没有答上来 回来做了总结: 1.前言 最近有同学问我有没有做过在线咨询功 ...

  2. 【mybatis源码学习】缓存机制

    一.mybatis的缓存 一级缓存:sqlsession级别,默认开启(一个事务内有效)二级缓存:  sqlsessionFactory级别,需要手动开启,在xml配置cache节点(依赖事务的执行结 ...

  3. epool与select有什么区别

    select在一个进程中打开的最大fd是有限制的,由FD_SETSIZE设置,默认值是2048.不过 epoll则没有这个限制,它所支持的fd上限是最大可以打开文件的数目,这个数字一般远大于2048, ...

  4. windows cmd ftp 自动下载

    1.编写ftp的bat脚本: set year=%,% set day=%,%%,%%,% mkdir d:\ftp\%,% mkdir d:\ftp\%,%\%,%%,%%,% del d:\ftp ...

  5. ubuntu 16.04 安装teamviewer

    很多人可能会问,为什么要在ubuntu上安装teamview?shell不就够用了吗?但实际上,很多时候,在远程连接linux的时候,我们需要在图形用户界面上进行操作.现在我就遇到了一个实际的问题:每 ...

  6. laravel jwt实践

    laravel版本为5.5 1.使用 composer 安装 composer require tymon/jwt-auth 1.*@rc 2.发布配置文件 # 这条命令会在 config 下增加一个 ...

  7. python/shell代码片段

    查看某模块路径 Bash pip show --files selenium 文件编码转换 Bash convmv -f GBK -t UTF-8 --notest -r ydcz_1/ 查找当前目录 ...

  8. (CSDN 迁移) JAVA多线程实现-可回收缓存线程池(newCachedThreadPool)

    在前两篇博客中介绍了单线程化线程池(newSingleThreadExecutor).可控最大并发数线程池(newFixedThreadPool).下面介绍的是第三种newCachedThreadPo ...

  9. Java的三大版本

    Java的三大版本 Write Once.Run Anywhere JavaSE:标准版(桌面程序,控制台开发......) JavaME:嵌入式开发(手机,小家电......) JavaEE:E企业 ...

  10. Servlet3.0对异步处理的支持

    Servlet工作流程 Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下: Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理: 调用业务接口的某些方 ...