0

我需要在我的数据库中删除大约 300,000 个重复项。我想检查Card_id重复的列,然后检查重复的时间戳。然后删除一份并保留一份。例子:

| Card_id | Time |    
| 1234    | 5:30 |     
| 1234    | 5:45 |    
| 1234    | 5:30 |    
| 1234    | 5:45 |

所以剩下的数据是:

| Card_id | Time |     
| 1234    | 5:30 |     
| 1234    | 5:45 |

我尝试了几种不同的删除语句,并合并到一个新表中,但没有运气。

更新:得到它的工作!

好吧,经过多次失败后,我得到了这个为 DB2 工作。

delete from(
select card_id, time, row_number() over (partition by card_id, time)  rn
from card_table) as A
where rn > 1

当 card_id 和 time 重复时,rn 增加。重复的或第二个 rn 将被删除。

4

2 回答 2

2

我强烈建议您采用这种方法:

create temporary table tokeep as
    select distinct card_id, time
    from t;

truncate table t;

insert into t(card_id, time)
    select *
    from tokeep;

也就是说,存储你想要的数据。截断表,然后重新生成它。通过截断表,您可以保持触发器和权限以及与表相关联的其他内容。

这种方法也应该比删除很多很多重复项更快。

如果你要这样做,你还应该插入一个正确的 id:

create temporary table tokeep as
    select distinct card_id, time
    from t;

truncate table t;

alter table t add column id int auto_increment;

insert into t(card_id, time)
    select *
    from tokeep;
于 2013-07-31T19:24:16.207 回答
0

如果您没有Primary keyCandidate key可能没有仅使用一个命令的选项。试试下面的解决方案。

创建具有重复项的表

  select Card_id,Time
  into COPY_YourTable
  from YourTable
  group by Card_id,Time
  having count(1)>1

使用 COPY_YourTable 删除重复项

  delete from YourTable
  where exists 
   (
     select 1
     from COPY_YourTable c
     where  c.Card_id = YourTable.Card_id
     and c.Time = YourTable.Time
   )

复制数据不重复

   insert into YourTable
   select Card_id,Time
   from COPY_YourTabl
于 2013-07-31T19:27:30.297 回答