很多人新手对于数据库distinct 的用法有误解接下来我们看一段代码:

数据表:table  id name

   1 a
   2 b
   3 c
   4 c
   5 b

  我们使用distinct来去重name是这样:

 select distinct name from table 结果为:

     a

     b

    c

 可是一般数据库去重都是需要不止一个字段接下来看这个:

  select distinct name, id from table 多了个id效果会怎样呢

   1 a
   2 b
   3 c
   4 c
   5 b

  结果并不是我们想象的一样去重了接下来我们继续:

  select *, count(distinct name) from table group by name 这条sql 就不一样了效果如下

   1 a 1

   2 b 1

   3 c 1

  看到效果了吧,只是后面多了一个count 查出来的数据这个不影响,是可以用的.

  

2.Sql去重语句

 

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

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

1 delete from 表 where id not in
2 (select max(id) from 表 group by mobilePhone,officePhone,email )
3 or
4 delete from 表 where id not in
5 (select min(id) from 表 group by mobilePhone,officePhone,email )

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

1 //查询出唯一数据的ID,并把他们导入临时表tmp中
2 select min(id) as mid into tmp from 表 group by mobilePhone,officePhone,email
3  
4 //查询出去重后的数据并插入finally表中
5 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分钟。

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

  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分钟。

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
 

关于sql多表去重问题的更多相关文章

  1. Oracle使用SQL传输表空间

    源环境:RHEL 6.4 + Oracle 11.2.0.4 目的环境:RHEL 6.4 + Oracle 11.2.0.4 DG双机 要求:使用SQL传输表空间DBS_D_JINGYU从源环境到目的 ...

  2. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  3. 在一个SQL Server表中的多个列找出最大值

    在一个SQL Server表中一行的多个列找出最大值 有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示 这里给出一个例子 IF (OBJECT_ID('tempdb..# ...

  4. SQL Server表分区的NULL值问题

    SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...

  5. SQL Server 表变量和临时表的区别

    SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...

  6. sql一个表中两个字段合并求和

    sql一个表中两个字段,合并求和 SELECT SUM(字段a+'.'+字段b) as total  from TABLE

  7. [转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?

    原来使用SQL Server 2000数据库,通过DTS工具很方便地在SQL Server和DBF文件之间进行数据的导入和导出,现在安装了SQL Server2005之后,发现其提供的“SQL Ser ...

  8. SQL server 表中如何创建索引?

    SQL server 表中如何创建索引?看个示例,你就会了 use master goif db_id(N'zhangxu')is not nulldrop database zhangxugocre ...

  9. 图解SQL多表关联查询

      图解SQL多表关联查询     网上看了篇文章关于多表连接的,感觉很好,记录下来,以便日后自己学习  内连接     左连接     右连接       全外连接   1. 查两表关联列相等的数据 ...

随机推荐

  1. X509证书认证流程介绍

    X509证书介绍X.509 是由国际电信联盟(ITU-T)制定的数字证书标准,相信这是人尽皆知的了,目前X.509证书据我所知有三个版本,.net中使用的是x.509-2,X.509-2 版引入了主体 ...

  2. 【Android】你知道还可以通过 View.animate() 来实现动画么

    这次想来讲讲 View.animate(),这是一种超好用的动画实现方式,用这种方式来实现常用的动画效果非常方便,但在某些场景下会有一个坑,所以这次就来梳理一下它的原理. 基础 首先,先来看一段代码: ...

  3. 关于mongodb按照字段模糊查询方法

    模糊查询:tname包含某个关键字测试' cd /opt/soft/mongodb/bin ./mongo --host 192.168.0.1  --port 17017  test db.test ...

  4. 关于Spring注解@Async引发其他注解失效

    概述 在前面一篇文章中,介绍,在一个Bean中注入自己,如果有@Async和@Transaction,如果使用@Autowire注入自身,会报循环依赖,如果使用BeanFactoryAware注入自己 ...

  5. Webpack模块的导出以及之间的依赖引用

    一. 模块化开发模块化开发说白了就不必在html页面,引用所有的js文件.所有的js文件都进行模块化设置,模块之间可以相互引用.Webpack模块化开发是使用module.exports进行相关方法和 ...

  6. linux --> Makefile编写

    Makefile编写 单目录 测试程序在同一个文件中,共有func.h.func.c.main.c三个文件,Makefile写法如下所示: CC = gcc CFLAGS = -g -Wall mai ...

  7. kvm之三:本地安装虚拟机

    1.格式化新添加的磁盘 [root@kvm ~ ::]#fdisk /dev/sdb Command (m for help): n //新建分区 Command action e extended ...

  8. linux No space left on device 由索引节点(inode)爆满引发500问题

    inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取 ...

  9. web服务器学习1---httpd-2.4.29源码手动编译安装

    环境准备: 系统:CentOS 7.4 软件:httpd-2.4.29 一  Apache主要特点 apache服务器在功能,性能和安全性等方面表现比较突出,可以较好地满足web服务器地应用需求.主要 ...

  10. 2018c语言第1次作业

    6-1 计算两数的和与差 1.设计思路 (1)主要描述题目算法 第一步:把两个数的加减法分别赋给psum和pdiff. 第二步:通过psum和pdiff的地址把值传回主函数. (2)流程图.(无) 2 ...