关于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. 查两表关联列相等的数据 ...
随机推荐
- 笔记:Jersey REST 传输格式
通常REST接口会以XML或JSON作为主要传输格式,同时 Jersey 也支持其他的数据格式,比如基本类型.文件.流等格式. 基本类型 Java的基本类型又叫原生类型,包括4种整数(byte.sho ...
- ReactNative环境配置的坑
我用的是windows开发android,mac的可以绕道了. 1.android studio及Android SDK的安装 现在需要的Android版本及对应的tool 2.真机运行要配置对and ...
- django初探-创建简单的博客系统(二)
上篇django初探-创建简单的博客系统(一)已经记录了Django实现博客的发布的整个过程,接下来继续说明博客标题和内容的显示. 显示博客详细 将博客内容保存到数据库还不是发布博客的终极目的,博客一 ...
- 兄弟连学Python-Mysql的操作应用
1.创建数据库 格式: create database if not exists 数据库名 default charset utf8; 注意: 1.数据库是唯一的 2.if not exists先判 ...
- 国内可用的Internet时间同步服务器地址(NTP时间服务器)
不知道什么鬼我这系统自带的Internet时间同步服务器地址居然不可用,终端ping系统自带服务器两个居然都不通???难道时间服务器也和谐么? 好在阿里云提供了7个NTP时间服务器也就是Interne ...
- 测试与发布(Beta版本)
评分基准: 按时交 - 有分(测试报告-10分,发布说明-10分,展示博客-10分),检查的项目包括后文的两个方面 测试报告(基本完成5分,根据完成质量加分,原则上不超过满分10分) 发布说明(基本完 ...
- 实验四Java Android简易开发
实验准备 Android Studio下载 Android Studio安装 实验内容 Android Stuidio的安装测试 Android Stuidio的安装测试: 参考<Java和An ...
- 2017-2018-1 20155215 第五周 mybash的实现
题目要求 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解,实现过程和问题解决的博客(包含代码托管链接) 学习fork,exec,wait fork ma ...
- 《Language Implementation Patterns》之访问&重写语法树
每个编程的人都学习过树遍历算法,但是AST的遍历并不是开始想象的那么简单.有几个因素会影响遍历算法:1)是否拥有节点的源码:2)是否子节点的访问方式是统一的:3)ast是homogeneous或het ...
- Flask 学习 八 用户角色
角色在数据库中表示 app/models.py class Role(db.Model): __tablename__='roles' id = db.Column(db.Integer,primar ...