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

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

from T1 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去重差个数,oracle去重相关推荐

  1. oracle去重差个数,Oracle基础(五):多表查询

    一.多表查询 (一)简单多表查询 1.多表查询的机制 1)SQL: SELECT * FROM emp; --14条记录 SELECT * FROM dept;--4条记录 SELECT * FROM ...

  2. oracle去重差个数,多表查询 - Oracle 查询技巧与优化_数据库技术_Linux公社-Linux系统门户网站...

    前言 上一篇blog介绍了Oracle中的单表查询和排序的相关技巧,本篇blog继续介绍查询中用的最多的--多表查询的技巧与优化方式,下面依旧通过一次例子看一个最简单的多表查询. 多表查询 上一篇中提 ...

  3. oracle横向统计个数,Oracle横向求最大值

    由于最近在开发过程中,需要在Oracle中取横向栏位的最大值,在此介绍几个Oracle的函数给大家: 具体内容请内博客内文,如果对各位有所帮助,请留下痕迹! Oracle纵向取最大值函数为:max() ...

  4. oracle 查询差值,oracle取差值集合

    Oracle Minus关键字 SQL中的MINUS关键字 SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果 ...

  5. oracle 查询索引个数,Oracle数据库索引的创建和查询

    索引命名规范:普通索引最好i_开头,唯一索引最好u_开头,primary key索引最好pk_开头 1.创建索引:create index 索引名 on 表名(字段名); 2.查询索引 oracle中 ...

  6. mysql 去重取最大值_mysql去重取最大值,逻辑类似oracle的over(partition by)函数

    像下表一样的数据,有重复的合同号,但是我只想保留同一合同号中回款金额最大的那一行,也就是图中红框里的数据. oracle方法: 在oracle中,我们可以简单地用over(partition by)函 ...

  7. oracle如何取正负数,ORACLE 统计正负个数sql

    ORACLE 统计正负个数sql select ss.*, sum(ss.aa) over (partition by ss.zsid order by ss.zsid) as fu, sum(ss. ...

  8. excel如何去重统计户数_去重条件计数(excel去重统计个数)

    去重条件计数(excel去重统计个数) 2020-05-08 11:12:07 共10个回答 为达成效果,花时间完全照你的重录一遍,因为你没有列标行号,故以我下图为例,在充值人数去重合计栏的G2单元格 ...

  9. oracle修改数据文件个数,Oracle修改数据文件名/移动数据文件

    生产上有时会用到数据文件的迁移,下边示例几种数据文件的迁移方法. 数据库版本sys@ORCL>select * from v$version; select * from v$version; ...

最新文章

  1. 黑盒测试方法之等价类划分法
  2. Web前端培训面试攻略
  3. CUBRID学习笔记 1 简介 cubrid教程
  4. Failed to load resource: the server responded with a status of 500 (Internal Server Error)
  5. java实现可选形参_Java:可选的可选实现
  6. Python-Learn
  7. UVALive - 3641 Leonardo's Notebook(polya计数)
  8. [渝粤教育] 西南科技大学 理论力学 在线考试复习资料(1)
  9. Linux学习笔记(详细)
  10. idea中自动生成Java类图和时序图
  11. 用TensorFlow Lite 写个手写体识别 APP
  12. 小程序apkg还原_如何禁用微信小程序(适合任何机型的完美解决方案)
  13. 如何做拉新活动?拉新裂变的12种玩法,你学废了没?
  14. 《Python基础教程》PDF
  15. wxpython wx.Destroy()和wx.Close()区别
  16. 润乾报表Api导出word只读
  17. 音频算法检测发言者方位
  18. 项目管理的五个典型工具
  19. Visual C++实现推箱子游戏的核心算法设计与实现(附源码和和资源)
  20. 机器学习(回归八)——Softmax回归

热门文章

  1. connectify
  2. 使用CDN加速你的博客
  3. Day 195/200 Vue3 项目使用CDN加速
  4. (33)ISE 约束文件(IO约束)
  5. oracle用户锁定,解锁(已解决)
  6. .mat数据转化为png图片
  7. 朝阳群众盯上了望京A座?举报996造成交通严重堵塞。996将成历史?
  8. vissim交通仿真实验(2)--十字信号交叉口
  9. 前端 js 将字符串类型转换成其他类型
  10. ipad分屏功能_iOS13新增哪些实用功能?1分钟了解!