海量数据(百万以上),其中有些全部字段都相同,有些部分字段相同,怎样高效去除重复?
如果要删除手机(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。
方法一按照多条件重复处理:
1 delete tmp from(
2 select row_num = row_number() over(partition by 字段,字段 order by 时间 desc)
3 from 表 where 时间> getdate()-1
4 ) tmp
5 where row_num > 1
方法二按照单一条件进行去重:
1 delete from 表 where 主键ID not in(
2 select max(主键ID) from 表 group by 需要去重的字段 having count(需要去重的字段)>=1
3 )
注意:为提高效率如上两个方法都可以使用临时表, not in 中的表可以先提取临时表#tmp,
然后采用not exists来执行,为避免数量过大,可批量用Top控制删除量
1 delete top(2) from 表
2 where not exists (select 主键ID
3 from #tmp where #tmp.主键ID=表.主键ID)
分享到:
相关推荐
在SQL Server数据库管理中,去重操作是一项常见的数据清洗任务,尤其对于保持数据一致性、准确性至关重要。本篇文章将详细介绍如何在SQL Server中针对单个字段和多个字段进行去重操作。 1. 单字段去重查询: 当...
Oracle语句以免以后忘记 没有存储过程,简单的数据库
SQL去重清除冗余数据 SQL去重是指清除查询结果或者是数据库里不必要的相对某个字段的冗余数据。对于查询结果去重,可以使用distinct关键字标注需要去重的字段,也可以使用group by + 关键字。 使用distinct关键字...
本文将详细介绍几种SQL去重的方法,并通过具体的示例来解释每种方法的应用场景及其背后的原理。 ### 方法一:使用 `SELECT DISTINCT` `SELECT DISTINCT` 是最常用的去重方式之一,它可以返回指定列中的不同值。...
【LINQ to SQL 高级查询详解】 LINQ (Language Integrated Query) 是.NET框架中的一种技术,它允许程序员使用一种直观、类似SQL的语法在代码中处理数据。LINQ to SQL 是 LINQ 的一个实现,专门用于与关系数据库进行...
在SQL Oracle领域,掌握高效的语句操作是提升数据库管理与应用能力的关键。Oracle数据库系统是全球广泛使用的数据库管理系统之一,其SQL语法具有丰富的特性和功能。以下是对标题和描述中涉及的一些重要知识点的详细...
SQL查询语句是数据库操作的核心,它用于从数据库中提取所需的数据。本篇文章将深入探讨SQL查询语句的两个关键组成部分:简单查询和FROM子句。 简单查询主要涉及选择列表、FROM子句和WHERE子句。选择列表允许指定...
### SQL查询语句使用 #### 一、基本概念与结构 在进行数据库操作时,**SQL(Structured Query Language)**是一种极为重要的语言工具,用于管理关系型数据库管理系统中的数据。SQL不仅能够帮助我们检索数据,还能...
这些方法利用了ROWID、GROUP BY、DISTINCT等关键字来实现数据去重的功能。 ### 1. 使用ROWID进行去重 ROWID是Oracle中的一种特殊的数据类型,用于唯一标识表中的一行记录。通过比较ROWID可以轻松识别出重复的数据...
### SQL Server去重知识点解析 #### 一、背景与需求 在处理数据库中的重复记录时,去除重复数据是一项常见的需求。对于SQL Server来说,去重不仅能够提高数据查询的效率,还能确保数据的一致性和准确性。本文将...
在SQL中,使用`CREATE TABLE`语句来定义表的结构,包括列名、数据类型、默认值和约束条件。例如,创建一个名为`Student`的表,包含ID、姓名和年龄三列,可以这样写: ``` CREATE TABLE Student ( ID INT PRIMARY ...
本文将详细介绍如何使用SQL语句来查询表中的重复数据,并基于提供的SQL示例进行深入分析。 ### SQL查询重复数据的核心概念 在开始之前,我们需要了解几个关键的概念: 1. **重复数据**:指的是在数据表中存在多条...
按照指定字段查询出出现重复的数据 SELECT m.* FROM dbo.Sheet1$ m,( SELECT ZCMC,ZCFL,XH FROM dbo.Sheet1$ GROUP BY ZCMC,ZCFL,XH HAVING COUNT(1)>1 ...WHERE m.ZCMC=m1.ZCMC AND m.ZCFL=m1.ZCFL and m.XH=m1....
`UNION`操作符用于合并两个或多个`SELECT`语句的结果集,同时会自动去重。 **示例:** ```sql SELECT * FROM department WHERE department_id UNION SELECT * FROM department WHERE department_id > 20; ``` 这...
### MySQL SQL经典语句知识点详解 #### 一、基础操作 **1. 创建数据库** - **语法**: `CREATE DATABASE database-name;` - **说明**: 此命令用于创建一个新的数据库实例。`database-name`应替换为实际数据库名称...
本文主要介绍如何使用SQL语句来实现“去重留一”,即删除重复记录并仅保留一条,且判断重复的标准基于多个字段。以下是对这个问题的详细解答。 首先,面对存在重复记录的需求,通常的思路是通过编程语言遍历数据并...
以下是对标题和描述中提到的经典SQL语句的详细解释和扩展: 1. **创建数据库**:`CREATE DATABASE database-name` 用于创建一个新的数据库,其中`database-name`是你为新数据库指定的名称。 2. **删除数据库**:`...