关于sql多表去重问题
很多人新手对于数据库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多表去重问题的更多相关文章
- Oracle使用SQL传输表空间
源环境:RHEL 6.4 + Oracle 11.2.0.4 目的环境:RHEL 6.4 + Oracle 11.2.0.4 DG双机 要求:使用SQL传输表空间DBS_D_JINGYU从源环境到目的 ...
- SQL多表连接查询
SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...
- 在一个SQL Server表中的多个列找出最大值
在一个SQL Server表中一行的多个列找出最大值 有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示 这里给出一个例子 IF (OBJECT_ID('tempdb..# ...
- SQL Server表分区的NULL值问题
SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...
- SQL Server 表变量和临时表的区别
SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...
- sql一个表中两个字段合并求和
sql一个表中两个字段,合并求和 SELECT SUM(字段a+'.'+字段b) as total from TABLE
- [转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?
原来使用SQL Server 2000数据库,通过DTS工具很方便地在SQL Server和DBF文件之间进行数据的导入和导出,现在安装了SQL Server2005之后,发现其提供的“SQL Ser ...
- SQL server 表中如何创建索引?
SQL server 表中如何创建索引?看个示例,你就会了 use master goif db_id(N'zhangxu')is not nulldrop database zhangxugocre ...
- 图解SQL多表关联查询
图解SQL多表关联查询 网上看了篇文章关于多表连接的,感觉很好,记录下来,以便日后自己学习 内连接 左连接 右连接 全外连接 1. 查两表关联列相等的数据 ...
随机推荐
- Java基本包装类型
基本类型的对象包装,也就是将常用的基本数据类型包装成对象 byte Byte short Short int Integer long Long boolean Boolean float Float ...
- flex布局之兼容
Android 2.3 开始就支持旧版本 display:-webkit-box; 4.4 开始支持标准版本 display: flex; IOS 6.1 开始支持旧版本 display:-webk ...
- 【Python】 MySQLdb的安装与使用
MySQLdb MySQLdb是一款较为底层的,python连接mysql用的模块.和更加高级的,提供ORM的模块不同,MySQLdb主要还是聚焦于如何和数据库进行连接和进行基本的操作,操作的体现形式 ...
- 如何正确使用Java异常处理机制
文章来源:leaforbook - 如何正确使用Java异常处理机制作者:士别三日 第一节 异常处理概述 第二节 Java异常处理类 2.1 Throwable 2.1.1 Throwable有五种构 ...
- BigDecimal 转成 double
NUMBER(20,2) 数据库里的字段number ,实体是BigDecimal 将BigDecimal转成double public double getOrderamount() { if ( ...
- PHP-CGI,FASTcgi,php-fpm,之间的关系?
刚开始对这个问题我也挺纠结的,看了<HTTP权威指南>后,感觉清晰了不少.首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. ...
- easyui控件写法造成的错误
<input id="driver" name="driver" class="easyui-combobox" data-optio ...
- 一个典型的kubernetes工作流程 - kubernetes
1.准备好一个包含应用程序的Deployment的yml文件,然后通过kubectl客户端工具发送给ApiServer. 2.ApiServer接收到客户端的请求并将资源内容存储到数据库(etcd)中 ...
- Kettle 初始配置数据量类型资源库
PS:有段时间不使用Kettle了,但总遇到小伙伴问起,写一篇记录下. 文档使用版本:KETTLE 7.0 Kettle资源库可分为文件与数据库,文件型只需要配置好存放路径就行,这边介绍的是配置数据库 ...
- C语言第十一次博客作业---函数嵌套调用
一.实验作业 1.1 PTA题目 题目:递归实现顺序输出整数 1. 本题PTA提交列表 2. 设计思路 printdigits函数 定义整型变量result存放结果 if n是10的倍数 result ...