关于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. 查两表关联列相等的数据 ...
随机推荐
- 什么是DOM,DOM level 1\2\3 的区别是什么
DOM 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.Document Object Model的历史可以追溯至1990年 ...
- sentinel监控redis高可用集群(一)
一.首先配置redis的主从同步集群. 1.主库的配置文件不用修改,从库的配置文件只需增加一行,说明主库的IP端口.如果需要验证的,也要加多一行,认证密码. slaveof 192.168.20.26 ...
- poj-3185-开关问题
描述 牛一行20他们喝的水碗.碗可以那么(面向正确的为清凉水)或颠倒的(一个位置而没有水).他们希望所有20个水碗那么,因此用宽鼻子翻碗. 嘴太宽,他们不仅翻转一碗还碗的碗两侧(总共三个或三个——在两 ...
- 详细分析du和df的统计结果为什么不一样
今天有个人问我du和df的统计结果为什么会不同.给他解析了一番,后来想想还是写篇文章从原理上来分析分析. 我们常常使用du和df来获取目录或文件系统已占用空间的情况.但它们的统计结果是不一致的,大多数 ...
- 设计模式 --> (13)备忘录模式
备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态 示例 玩游戏时都会保存进度,所保存的进度以文件的形式存在.这样下次就可 ...
- ASP.NET没有魔法——ASP.NET MVC Razor与View渲染
对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...
- 腾讯云python网站开发环境搭建
前段时间腾讯云做活动,于是就花了几百大洋买了三年的云服务,准备在上 面安装python web的开发环境,下面将安装过程做一个总结,希望能够帮助大家. 一.使用环境 使用的软件环境为:CentOS ...
- Oracle之SQL优化专题01-查看SQL执行计划的方法
在我2014年总结的"SQL Tuning 基础概述"中,其实已经介绍了一些查看SQL执行计划的方法,但是不够系统和全面,所以本次SQL优化专题,就首先要系统的介绍一下查看SQL执 ...
- JavaScript(第三十一天)【JSON】
前两章我们探讨了XML的结构化数据,但开发人员还是觉得这种微型的数据结构还是过于烦琐.冗长.为了解决这个问题,JSON的结构化数据出现了.JSON是JavaScript的一个严格的子集,利用JavaS ...
- 听翁恺老师mooc笔记(14)--格式化的输入与输出
关于C语言如何做文件和底层操作: 文件操作,从根本上说,和C语言无关.这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数来操作文件,最基本的最原始的文件操作.你需要理解,我们在这部分所学习的 ...