如何剔除重复的记录

dahuzizyd 2008-10-15 07:33:00
如何剔除重复的记录

背景,有一个表,A(日期型),B,C为复合主键。
另外还有三个字段D(日期型),E,F

现在要根据D,E,F判断表中相同的记录,然后相同的记录中取A最大的那条记录。

效果:
A | B | C | D | E | F
---------------------------------------------------------------------------------------
20081015 | 123 | 123 | 20081015 | aaa | aaa
20081014 | 123 | 321 | 20081015 | aaa | aaa

根据上面的数据,选出的结果是第一条记录。

※主要还要考虑效率问题,总共有20万条记录,选出来的数据要全部Insert到另一张表中

查了以前的帖子,没有找到适合的,请大家指教,先行谢过了。
...全文
295 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
loneyli78 2008-10-16
  • 打赏
  • 举报
回复
刚测试过楼主的实例。。。。有一个问题。。。当a,d列两条记录的内容分别相同。。那上面的语句就不成立。。。还是楼主贴上实这、际的数据。。。。。如A列的日期为20080101 D列的日期为20081010这样。。。
loneyli78 2008-10-16
  • 打赏
  • 举报
回复
select * from a where a in (select max(a) from a group by d,e,f);
loneyli78 2008-10-16
  • 打赏
  • 举报
回复
select * from a where a in (select max(a) from a group by d,e,f);
ai5173609 2008-10-16
  • 打赏
  • 举报
回复
不清楚LZ,是只把重复记录中选A最大的一条记录,还是没有重复的也要选出来?
如果是后者,那8楼的符合要求,
haifeng1012 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sleepzzzzz 的回复:]
看我的.

SQL codeinsert into other_tb
select A, B, C, D, E, F
from old_table
where rowid in (select rd
from (select rowid rd,
row_number() over(partition by D, E, F order by A desc) rn
from old_table
where rn = 1))
[/Quote]

同意 8 楼 的,比较符合楼主的要求!!
haifeng1012 2008-10-16
  • 打赏
  • 举报
回复

delete
from taba
where (a,d,e,f) not in (
select max(a) a,d,e,f
from x
group by d, e,f)

oraplsql 2008-10-16
  • 打赏
  • 举报
回复
INSERT INTO Tbl_NewData(A,B,C,D,E,F)
SELECT A,B,C,D,E,F
FROM Tbl_Data TA
,(SELECT MAX(A) AS MAX_A
, D AS GROUP_D
, E AS GROUP_E
, F AS GROUP_F
FROM Tbl_Data
GROUP BY D, E, F) TB
WHERE TA.A = TB.MAX_A
AND TA.D = TB.GROUP_D
AND TA.E = TB.GROUP_E
AND TA.F = TB.GROUP_F
oraplsql 2008-10-16
  • 打赏
  • 举报
回复
INSERT INTO Tbl_NewData(A,B,C,D,E,F)
SELECT MAX(A) AS MAX_A
,B
,C
,D
,E
,F
FROM Tbl_Data
GROUP BY B,C,D,E,F
sjq521521 2008-10-16
  • 打赏
  • 举报
回复
这种删除重复记录的,一般就用ROWID来搞定。8楼的是可行的。
diliugan100 2008-10-16
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20081016/01/223a8629-0ba6-4659-a1cf-d7b4ca5cbdad.html
Jinxp 2008-10-15
  • 打赏
  • 举报
回复
用rowid来删除
sleepzzzzz 2008-10-15
  • 打赏
  • 举报
回复
看我的.
insert into other_tb
select A, B, C, D, E, F
from old_table
where rowid in (select rd
from (select rowid rd,
row_number() over(partition by D, E, F order by A desc) rn
from old_table
where rn = 1))
codearts 2008-10-15
  • 打赏
  • 举报
回复
俺总结的,自已参考修改

--以下是删除重复数据的3种方案
--3种方案都是最优化的
--object_name, object_id. 这2个字段用来判断重复

--1.
delete
from x
where rowid in
(
select rd
from (
select rowid rd
,row_number() over(partition by object_name, object_id order by rowid) rn
from x
) x
where rn > 1
)

--2.
delete
from x
where rowid not in (
select max(rowid)
from x
group by object_name, object_id
)

--3.
create table tmp_x
AS
select x1.(字段列表..略)
from
(
select x.*, row_number() over(partition by object_name, object_id order by rowid) rn
from x
) x1
where rn = 1;

truncate table x;

insert into x
select *
from tmp_x;

drop table tmp_x;

BlueskyWide 2008-10-15
  • 打赏
  • 举报
回复
再试一下:

insert into tableB as
(select tab1.a,tab1.b,tab1.c,tab1.d,tab1.e,tab1.f from
(select a,b,c,d,e,f,count(*) from tableA group by d,e,f having count(*)>1) tab1,
(select max(t1.a) ta
from (select * from tableA ) t1,(select * from tableA ) t2
where t1.d = t2.d and t1.e = t2.e and t1.f=t2.f) tab2
where tab1.a=tab2.ta
)
mantisXF 2008-10-15
  • 打赏
  • 举报
回复
-- 哈哈,没看清还有除去重复记录,用下面改后的SQL:
INSERT INTO TABLE_NAME
SELECT *
FROM TEST_A T1
WHERE ROWID < (SELECT MIN(ROWID)
FROM TEST_A T2
WHERE T1.D = T2.D
AND T1.E = T2.E
AND T1.F = T2.F
AND T1.A > T2.A);
[Quote=引用 4 楼 sleepzzzzz 的回复:]
2楼的只是把重复的数据按A值最大写到了另一张表,而不重复的数据还没写过去.
[/Quote]
sleepzzzzz 2008-10-15
  • 打赏
  • 举报
回复
2楼的只是把重复的数据按A值最大写到了另一张表,而不重复的数据还没写过去.
liyongjie 2008-10-15
  • 打赏
  • 举报
回复
select * from
(select * from test ) ta,
(select * from test ) tb
where ta.b = tb.b
and ta.a = tb.a
and ta.a = (
select max(ta.a) from
(select * from test ) ta,
(select * from test ) tb
where ta.b = tb.b
and ta.a = tb.a
)
mantisXF 2008-10-15
  • 打赏
  • 举报
回复
-- TRY IT ..
INSERT INTO TABLE_NAME
SELECT *
FROM TABLE_A T1
WHERE EXISTS (SELECT 1
FROM TABLE_A T2
WHERE T1.D = T2.D
AND T1.E = T2.E
AND T1.F = T2.F
AND T1.A > T2.A);
[Quote=引用楼主 dahuzizyd 的帖子:]
如何剔除重复的记录

背景,有一个表,A(日期型),B,C为复合主键。
另外还有三个字段D(日期型),E,F

现在要根据D,E,F判断表中相同的记录,然后相同的记录中取A最大的那条记录。

效果:
A | B | C | D | E | F
---------------------------------------------------------------------------------------
20081015 | 12…
[/Quote]
BlueskyWide 2008-10-15
  • 打赏
  • 举报
回复
try it:

create table tableB as (select max(A),b,c,d,e from tableA order by c,d,e group by c,d,e);


[Quote=引用楼主 dahuzizyd 的帖子:]
如何剔除重复的记录

背景,有一个表,A(日期型),B,C为复合主键。
另外还有三个字段D(日期型),E,F

现在要根据D,E,F判断表中相同的记录,然后相同的记录中取A最大的那条记录。

效果:
A | B | C | D | E | F
---------------------------------------------------------------------------------------
20081015 | 12…
[/Quote]

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧