`
hz_chenwenbiao
  • 浏览: 994625 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

用SQL语句去掉重复的记录(转)

SQL 
阅读更多

海量数据(百万以上),其中有些全部字段都相同,有些部分字段相同,怎样高效去除重复?

如果要删除手机(mobilePhone),电话(officePhone),邮件(email)同时都相同的数据,以前一直使用这条语句进行去重:

delete from 表 where id not in  

(select max(id) from 表 group by mobilePhone,officePhone,email )  

or 

delete from 表 where id not in  

 (select min(id) from 表 group by mobilePhone,officePhone,email ) 

 

其中下面这条会稍快些。上面这条数据对于100万以内的数据效率还可以,重复数1/5的情况下几分钟到几十分钟不等,但是如果数据量达到300万以上,效率骤降,如果重复数据再多点的话,常常会几十小时跑不完,有时候会锁表跑一夜都跑不完。无奈只得重新寻找新的可行方法,今天终于有所收获:

//查询出唯一数据的ID,并把他们导入临时表tmp中  

select min(id) as mid into tmp from 表 group by mobilePhone,officePhone,email  

  

 //查询出去重后的数据并插入finally表中  

insert into finally select (除ID以外的字段) from customers_1 where id in (select mid from tmp) 

 

效率对比:用delete方法对500万数据去重(1/2重复)约4小时。4小时,很长的时间。

用临时表插入对500万数据去重(1/2重复)不到10分钟。

其实用删除方式是比较慢的,可能是边找边删除的原因吧,而使用临时表,可以将没有重复的数据ID选出来放在临时表里,再将表的信息按临时表的选择出来的ID,将它们找出来插入到新的表,然后将原表删除,这样就可以快速去重啦。

SQL语句去掉重复记录,获取重复记录

按照某几个字段名称查找表中存在这几个字段的重复数据并按照插入的时间先后进行删除,条件取决于order by 和row_num。

方法一按照多条件重复处理:

delete tmp from(  

select row_num = row_number() over(partition by 字段,字段 order by 时间 desc)  

    from 表 where 时间> getdate()-1  

 ) tmp  

 where row_num > 1 

 

方法二按照单一条件进行去重:

delete from 表 where 主键ID not in(  

select max(主键ID) from 表 group by 需要去重的字段 having count(需要去重的字段)>=1  

 ) 

 

注意:为提高效率如上两个方法都可以使用临时表, not in 中的表可以先提取临时表#tmp,

然后采用not exists来执行,为避免数量过大,可批量用Top控制删除量

delete top(2) from 表   

         where  not exists (select 主键ID  

   from #tmp where #tmp.主键ID=表.主键ID) 

 

分享到:
评论

相关推荐

    SQL语句去掉重复记录,获取重复记录

    SQL语句去掉重复记录,获取重复记录

    使用SQL语句去掉重复的记录【两种方法】

    主要介绍了用SQL语句去掉重复的记录的两种方式,两种方式都可以使用临时表操作,具体实现方法大家跟随脚本之家小编一起通过本文学习吧

    SQL语句集锦.rar

    去掉重复的列名.txt 取n到m条记录.txt 合并字符串.txt 多列的行转列.sql 多行补充.sql 多表对多表进行统计.txt 大小写转换.txt 子查寻和内联查寻.txt 学生名次.txt 嵌套游标的使用.txt 拷贝表格.txt 排序.txt ...

    清除SQL数据库里的重复记录

    教你如何在SQL数据库后台通过SQL语句删除重复SQL记录。

    sql去除重复记录大全

    各种去除重复的sql语句,日常常用,适合一些刚开始学习的基础人员

    sqlserver利用存储过程去除重复行的sql语句

    还是先上代码吧 ,可以先看 SQL语句去掉重复记录,获取重复记录 代码如下: ALTER procedure [dbo].[PROC_ITEMMASTER_GETUNIQUE] @PAGEINDEX INT,@uid int,@itemnumber varchar(50) AS begin tran –开始事务 drop ...

    精通sql结构化查询语句

    6.1 查询的基本结构 6.1.1 了解SELECT语句 6.1.2 SELECT语句的语法格式 6.1.3 SELECT语句的执行步骤 6.2 简单的查询语句 6.2.1 查询表中指定的字段 6.2.2 查询所有的字段 6.2.3 使用DISTINCT去除重复信息 ...

    数据库中重复值和空值的处理

    在一些情况下,如要查询数据中的几个字段,此时有可能产生重复记录,而重复的记录是不符合规范的,数据表是现实世界的客观反映,因此,...  在使用DISTINCT关键字去除重复记录时,需将DISTINCT关键字放在第一个字段

    MYSQL常用命令大全

    然后使用source命令,后面参数为脚本文件(如这里用到的.sql) mysql>source wcnc_db.sql B:使用mysqldump命令 mysqldump -u username -p dbname < filename.sql C:使用mysql命令 mysql -u username -p -D dbname ...

    精通SQL--结构化查询语言详解

    5.2.3 使用distinct去除重复信息 86 5.2.4 多列查询 87 5.2.5 查询所有的列 88 5.3 排序查询结果 89 5.3.1 单列排序 89 5.3.2 多列排序 90 5.3.3 采用序号进行多列排序 91 5.3.4 反向排序 92 5.4 使用where...

    21天学会SQL

    3.3 使用SQL语句创建、修改、 删除数据库 59 3.3.1 用CREATE DATABASE语句 创建数据库 59 3.3.2 用ALTER DATABASE语句 修改数据库 60 3.3.3 用DROP DATABASE语句 删除数据库 62 3.4 附加与分离数据库 63 3.4.1 分离...

    精通SQL 结构化查询语言详解

    5.2.3 使用DISTINCT去除重复信息  5.2.4 多列查询  5.2.5 查询所有的列 5.3 排序查询结果 5.3.1 单列排序  5.3.2 多列排序 5.3.3 采用序号进行多列排序 5.3.4 反向排序  5.4 使用WHERE子句定义搜索条件...

    sqlserver查询

    (2) 查找flower表中所有鲜花的类别fclass,去掉重复记录 写出命令: Select distinct fclass from flower (3) 查找flower表中的fname 花名,cailiao 材料,huayu 花语 ,price 市场价,yourprice 现价 字段 写出命令: ...

    程序员的SQL金典.rar

     2.2 通过SQL语句管理数据表  2.2.1 创建数据表  2.2.2 定义非空约束  2.2.3 定义默认值  2.2.4 定义主键  2.2.5 定义外键  2.2.6 修改已有数据表  2.2.7 删除数据表  2.2.8 受限操作的变通解决方案 第3章 ...

    程序员的SQL金典4-8

     2.2 通过SQL语句管理数据表  2.2.1 创建数据表  2.2.2 定义非空约束  2.2.3 定义默认值  2.2.4 定义主键  2.2.5 定义外键  2.2.6 修改已有数据表  2.2.7 删除数据表  2.2.8 受限操作的变通解决方案 第3章 ...

    2009达内SQL学习笔记

    在处理SQL语句时,其中所有的空格都被忽略(空格只用来分开单词,连续多个空格当一个用)。 SQL语句可以在一行上写出,建议多行写出,便于阅读和调试。 多条SQL语句必须以分号分隔。多数DBMS不需要在单条SQL语句后...

    SQL性能优化

     首先,看是否用上了索引,对于该使用索引而没有用上索引的 SQL 语句,应该想办法用上索引。  其次,看是否用上正确的索引了,特别复杂的 SQL 语句,当其中 where 子句包含多个带有索引的字段时,更应该注意索引...

Global site tag (gtag.js) - Google Analytics