`

oracle去重整理

 
阅读更多

我们在实际工作中,当信息系统数据质量不高的时候,可能存在数据表中有重复记录的问题。方法:

1、保留重复记录中的一条

delete from t where rowid not in (select min(rowid) from t group by 去重字段); not in 可使用!=

2、select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1
将上面的>号改为=号就可以查询出没有重复的数据了。

3、要删除重复数据,建议在临时表中操作,提高性能

CREATE TABLE 临时表 AS (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1) ;
delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);

4、为了提高性能,可以在建立临时表时不要LOG和索引;并分析表。

1).通过create table ... as select将不重复的记录重建成表T_TEST_1
create table T_TEST_1 nologging tablespace &tablespace_name as
select col_id1, col_id2, col_3, col_4, col_5
from (select col_id1,
col_id2,
col_3,
col_4,
col_5,
updatetime,
row_number() over(partition by col_id1, col_id2 order by updatetime desc) rn
from T_TEST)
where rn = 1
2).对新表重建索引,原表有多少索引,在新表上也重建多少索引
create index IND_T_TEST_1 on T_TEST_1(col_id1, col_id2)
nologging tablespace &ind_tablespace_name;
3).收集新表统计信息,确保SELECT查询采用正确高效率的执行计划
declare
BEGIN
dbms_stats.gather_table_stats(ownname => '&user',
tabname => 'T_TEST_1',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
cascade => true,
method_opt => 'FOR ALL COLUMNS SIZE 1',
granularity => 'all');
END;
/
4).将新表和新索引更改为日志方式
alter table T_TEST_1 logging;
alter index IND_T_TEST_1 logging;
5.备份旧表,将新表切换上线
alter table T_TEST rename to T_TEST_BAK0902;
alter table T_TEST_1 rename to T_TEST;

不建议方案:不建议直接在原表T_TEST上做DELETE操作

===================================分割线=========================================

oracle里可以用 row_number()连子查询进行处理

select distinct table1.id,table1.name

from (select a.id,b.name, row_number() over (partition by c.wzbah order by b.id desc)rn
fromT1 a,T2 b

where a.id = b.id ) table1
where rn = 1

ps:

partition by 是用后面字段进行分割, rn是行号

这样就只取到行号为1的那一行了

可以用到max()函数

1、要求,在一个表中,某一字段为重复字段。需要去除重复字段。同时将所有字段显示出来

  SELECT * FROM (select a1,a2,a3,

  Row_number() OVER (PARTITION BY a1 ORDER BY a1) rn

  from a

  ) where RN = 1

 Row_number() OVER(PARTITION BY a1 ORDER BY a1)作用Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法

  ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的)

  RANK() 类似,不过RANK 排序的时候跟派名次一样,可以并列2个第一名之后 是第3名

  LAG 表示 分组排序后 ,组内后面一条记录减前面一条记录的差,第一条可返回 NULL

  BTW: EXPERT ONE ON ONE 上讲的最详细,还有很多相关特性,文档看起来比较费劲

  row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序)

  rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)

  dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。

  相比之下row_number是没有重复值的

  lag(arg1,arg2,arg3):

  arg1是从其他行返回的表达式

  arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。

  arg3是在arg2表示的数目超出了分组的范围时返回的值。

=====================================分割线========================================

查询及删除重复记录的SQL语句
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

注:rowid为oracle自带不用该.....

3、查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
(二)
比方说
在A表中存在一个字段“name”,
而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;
Select Name,Count(*) From A Group By Name Having Count(*) > 1
如果还查性别也相同大则如下:
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

(三)
方法一
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0 方法二
"重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
  1、对于第一种重复,比较容易解决,使用
select distinct * from tableName
  就可以得到无重复记录的结果集。
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
(四)
查询重复
select * from tablename where id in (
select id from tablename
group by id
having count(id) > 1
)
分享到:
评论

相关推荐

    oracle_plsql语句大全

    根据提供的标题、描述、标签及部分内容,我们可以整理出与Oracle PL/SQL相关的多个知识点,具体包括以下几个方面: ### Oracle PL/SQL 基础 **标题:** Oracle PL/SQL语句大全 **描述:** Oracle PL/SQL是Oracle...

    Oracle入门文档自己整理的不喜勿喷

    - **去重**:`DISTINCT` 关键字用来返回唯一的不同的值。 - **条件筛选**:`WHERE` 子句用于过滤结果集,例如 `WHERE 1 OR 2 AND 3`。 - **排序**:`ORDER BY` 子句用于根据指定的列对结果集进行排序,默认为升序...

    Oracle操作语句大全

    以上就是基于提供的文件内容整理的Oracle操作语句的详细介绍,涵盖了表结构描述、基础查询、数据选择与处理、字符串操作、去重查询、条件查询、区间与集合查询、日期查询、逻辑运算符、通配符查询和排序等方面的知识...

    整理oracle笔记

    根据提供的Oracle笔记内容,我们可以整理出以下详细的Oracle数据库知识点: ### Oracle登录方式 1. **命令行登录**:可以通过命令行使用`sqlplus`工具进行登录。例如: - `sqlplus system/system as sysdba`(以...

    oracle学习文档1

    根据提供的文档信息,我们可以整理出以下关于Oracle数据库学习的关键知识点: ### 1. 数据库管理系统 (DBMS) - **定义**: 数据库管理系统 (Database Management System, DBMS) 是一种用于创建、维护和管理数据库的...

    Oracle在线营销知识.docx

    1. **复杂数据处理**:支持从多个数据源导入客户信息,并按预设规则进行筛选、整理和去重,确保数据的准确性和一致性。 2. **细分市场分析**:企业可以基于特定标准对市场进行细分,从而更加精准地定位目标客户群体...

    Oracle课堂笔记常用命令,简单易懂

    以上就是从标题、描述以及部分内容中整理出来的Oracle知识点。这些内容不仅适用于初学者,也对有一定经验的DBA具有参考价值。通过理解并熟练掌握这些命令,可以更有效地管理和操作Oracle数据库。

    oracle数据库

    根据提供的文件信息,我们可以归纳总结出Oracle数据库相关...以上是基于给定的文件信息整理出的Oracle数据库相关的知识点及其具体应用场景。通过这些示例,我们可以更深入地理解Oracle数据库的基本操作和高级查询技巧。

    学习Oracle的笔记

    根据提供的文件信息,我们可以整理出一系列关于Oracle数据库学习的关键知识点,包括如何使用SQL Plus工具、基本的SQL查询语句以及一些常用的SQL函数等。下面是基于这些内容的具体知识点总结: ### 1. SQL Plus 工具...

    oracle学习资料

    根据提供的文件信息,我们可以整理出一系列与Oracle数据库相关的基础知识点,包括但不限于系统配置、命令行操作、表结构创建与管理等方面。以下是对这些知识点的详细解释: ### Oracle系统配置 在进行Oracle数据库...

    Oracle考试题讲解.docx

    根据提供的文档内容,我们可以整理出以下几个重要的Oracle数据库相关的知识点: ### 1. 使用 DISTINCT 进行去重查询 - **题目描述**:学生信息表 `StudentInfo` 中包含了一个字段“所在省市”,需要查询所有学生...

    oracle学习笔记(尚学堂版)

    本篇Oracle学习笔记主要由尚学堂马士兵老师的教学内容整理而成,旨在为初学者提供一个系统的学习框架与实践指南。通过以下知识点的梳理,我们可以更好地理解Oracle数据库的基础操作与SQL语言的应用。 #### SQL基础...

    vSphere入门到精通 Level 2问题整理1

    【vSphere入门到精通 Level 2问题整理】 在vSphere环境中,备份和恢复是至关重要的环节,本节主要讨论了虚拟机的备份实现、VDP(vSphere Data Protection)的功能以及快照的应用。 Q15:VDP备份依赖于完整的备份链...

    oracle 删除重复数据

    在Oracle数据库管理中,删除重复数据是一项常见的任务,特别是在数据清洗和数据整理的过程中。本文将详细探讨如何在Oracle中处理部分字段重复以及完全重复的数据。 首先,针对部分字段重复的情况,我们可以采用以下...

    Fresoar Data Manager 数据抽取工具(ETL)

    Frescoar Data Migration 2.0 支持多种主流数据库系统,如IBM DB2、Oracle、MS-SQL Server和MySQL。 在数据抽取阶段,Frescoar Data Manager能够从源数据库中提取数据,并保持原有的表结构不变,将其迁移到目标...

    kettle使用问题处理汇总整理.rar

    《Kettle使用问题处理汇总整理》 Kettle,又称Pentaho Data Integration(PDI),是一款强大的ETL(Extract, Transform, Load)工具,广泛应用于数据仓库和大数据处理项目中。它提供了图形化的界面,使得数据抽取、...

    整理总结20201225.txt

    - `catuser1.unl|sort|uniq>user2.unl`:对`user1.unl`文件中的内容进行排序并去重,结果保存到`user2.unl`文件中。 5. **其他常用命令**: - `df-h`:查看磁盘空间使用情况。 - `tar-zxvf`:解压tar.gz文件。 ...

    客户分布现状表.zip

    2. 数据库管理系统:存储大量客户信息时,通常会使用关系型数据库(如MySQL、Oracle)或NoSQL数据库(如MongoDB、Cassandra),以高效地管理和检索数据。 3. 表格处理软件:文件名中的“.xlt”是Microsoft Excel的...

    湖南大学校友综合服务信息平台技术方案.pdf

    该平台将能够收集整理校友详细信息,提供专业的校友网站、社区为校友服务,供世界各地的校友获取母校信息、分享相关资讯,同时加强校友与母校之间、校友与校友之间的互动交流,增加校友对母校与校友组织的信赖度、...

    [其他类别]某市人口普查系统_rkpcsys.zip

    【某市人口普查系统】是一个基于信息技术的管理平台,用于高效、准确地收集、整理和分析人口数据。这个系统可能包含多个模块,如数据录入、数据处理、数据分析、报告生成等,旨在帮助政府或其他相关机构更好地理解...

Global site tag (gtag.js) - Google Analytics