海量数据(百万以上),其中有些全部字段都相同,有些部分字段相同,怎样高效去除重复?
如果要删除手机(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 Server和Access中查询所有表名和字段名的方法。这些技术可以帮助开发者和数据库管理员更好地管理和维护数据库。
- 使用`SELECT DISTINCT`查询去除重复记录,并将结果存储到临时表`#Tmp`。 - 删除原始表,并将临时表中的数据重新导入到原表中。 以上是查询和处理SQL中重复记录的一些常用方法,每种方法都有其适用场景,实际应用...
- **UNION**:用于合并两个或多个SELECT语句的结果集,并去除重复的记录。 - **EXCEPT**:用于获取第一个SELECT语句结果集中存在而第二个SELECT语句结果集中不存在的记录。 - **INTERSECT**:用于获取两个SELECT语句...
这段SQL语句的主要作用是从`CUSTOM_INFO`表中删除重复记录,保留每组中`rowid`最大的一条记录。具体步骤如下: 1. **子查询**:`(SELECT MAX(rowid) FROM CUSTOM_INFO b WHERE a.sampleid = b.sampleid)`用来找出与...
### SQL语句一 #### 原始SQL语句: ```sql select *, (select count(0) from [picture] where album_id = [album].id) as piccount From [Album] Where id in (5,6,8,1,3,4) orderby charindex(',' + ltrim(rtrim...
本文将介绍两种使用SQL语句去除重复记录的方法,特别适合处理大量数据的情况。 方法一:基于`MIN`或`MAX`函数和子查询 这种方法通常涉及到使用`GROUP BY`子句来分组重复的记录,然后选择每个组中的最小或最大`ID`。...
3. **数据库备份**:在SQL Server中,你可以使用`sp_addumpdevice`存储过程创建备份设备,然后用`BACKUP DATABASE`语句进行数据库备份。例子中的命令创建了一个名为`testBack`的备份设备,并对`pubs`数据库进行了...
去掉重复的列名.txt 取n到m条记录.txt 合并字符串.txt 多列的行转列.sql 多行补充.sql 多表对多表进行统计.txt 大小写转换.txt 子查寻和内联查寻.txt 学生名次.txt 嵌套游标的使用.txt 拷贝表格.txt 排序.txt ...
在SQL语句中,处理重复数据是一项常见的任务。在给定的标题和描述中,主要涉及如何找出并处理数据库表中的重复记录。这里我们将详细探讨几种不同的方法。 首先,要找出重复的记录,我们可以利用`GROUP BY`和`HAVING...
DISTINCT关键字可以用来去除查询结果中的重复记录。 #### 创建无重复的新表 ```sql CREATE TABLE table_new AS SELECT DISTINCT * FROM table1 minux TRUNCATE TABLE table1; INSERT INTO table1 SELECT * FROM ...
- `[DISTINCT]`关键字可选,用于去除重复记录; - `column|expression`指定了要选择的列或表达式; - `alias`为列或表达式提供别名,增加结果集的可读性; - `FROM`关键字后跟表名,指定数据来源。 #### 示例 - **...
你可以根据需要选择一个或多个列,还可以通过WHERE子句设置条件,使用ORDER BY进行排序,GROUP BY进行分组,HAVING进行条件过滤,以及使用DISTINCT去除重复行。 2. INSERT语句:用于向数据库表中插入新记录。指定...
3. **去除重复行**:`SELECT DISTINCT UserName, unit FROM WS_User`。 4. **限制返回行数**:`SELECT TOP 10 UserName, unit FROM WS_User`或`SELECT TOP 10 PERCENT UserName, unit FROM WS_User`。 5. **数据导入...
SQL语句是数据库操作的核心工具,它用于查询、更新、管理数据库中的数据。在本文中,我们将深入探讨一些基本和高级的SQL语句及其应用。 首先,创建数据库是数据库管理的起点。`CREATE DATABASE`语句允许我们创建一...
本文将详细探讨如何利用SQL查询语句来去除表中的重复记录,并在此基础上进一步讨论如何进行性能优化。 #### 一、基本概念与背景 在实际工作中,数据库中的数据可能会因为各种原因而出现重复,例如数据录入错误、...
SQL Server 是一种关系型数据库管理系统,它提供了丰富的SQL语句来操作和管理数据库。本文将对SQL Server中的主要语句进行总结,分为数据定义语言(DDL)、数据操纵语言(DML)和数据控制语言(DCL)三部分。 1. ...
- `EXCEPT`:返回仅在第一个查询中存在的记录,去除重复行。 - `EXCEPT ALL`:同上,但保留所有行,包括重复行。 - `INTERSECT`:返回两个查询共同拥有的记录,去除重复行。 - `INTERSECT ALL`:返回两个查询...
以下是一些常用的SQL语句来实现这个过程: 1. **检测重复记录**: - 使用`GROUP BY`和`HAVING`子句可以找出重复的数据。例如,如果我们有一个`employees`表,包含`employee_id`和`email`字段,我们可以用以下查询...