2014-03-04 49 views
0

我有一个表,详细信息如下,person_item(id,person_id,item_name,value)。对于某些为person_id和ITEM_NAME,这应该是唯一的,如果我运行SQL脚本这意味着,SQL,如何使用GROUP BY删除重复数据

SELECT name,Count(*) FROM person_item GROUP BY person_id, item_name 

所有的选择应该只有一个。但是,我发现重复数据,并且对于每个person_id和item_name对,有时显示多于一行。我想要做的是保持每个GROUP BY的第一行并删除重复。算法应该这样,

1. FROM person_item GROUP BY person_id, item_name 
2. if Count(*)>1, remain the first one and delete the rest 

但是,我不知道如何编写这样的SQL脚本而不创建新的表。谢谢。

回答

0

我在MySql上测试了以下内容,并达到了目的。你需要两两件事要做

1.you必须引入一个唯一行标识符 - 在你的情况,我认为ID是目的

2.you已禁用MySQL的安全更新在编辑>首选项> Sql编辑器 如果您的行ID不是主键

create table test2 (
rowid varchar(10), 
id varchar(20), 
person_id varchar(20), 
item_name varchar(20), 
value varchar(20)); 

insert into test2 
(rowid,id, person_id,item_name,value) 
values ('1','1','1','first item','first value'); 

insert into test2 
(rowid,id, person_id,item_name,value) 
values ('2','1','1','first item','first value'); 

commit; 

SELECT item_name,Count(*) FROM test2 GROUP BY person_id, item_name; 


DELETE FROM Test2 
WHERE rowid NOT IN (SELECT * 
        FROM (SELECT MAX(n.rowid) 
          FROM test2 n 
         GROUP BY n.person_id, n.item_name) x); 

SELECT item_name,Count(*) FROM test2 GROUP BY person_id, item_name; 

NB如果您是创建架构的人员 - 可能您不能删除数据 - 那么您可以在 之前尝试此操作,确保您在玩区域中执行此操作。

+0

我试过,但是,NOT IN处理40,000行数据非常慢。在脚本之后,Mysql甚至不会显示任何响应。有其他方法吗? – zhouyu

+0

在这种情况下,表中的主键变为强制,因为表中没有索引,所以变得非常慢。 – user2919105

0

如果你想有一个唯一的约束,我建议你将其添加到模式并让数据库执行它。您不应处于必须编写此查询的位置。

听起来像这是一个多对多的JOIN表,主键应该是(person_id,item_name)。这将保证唯一性。

+0

感谢您的回答。但是,我不是可以添加架构的人,我是负责清理这些员工的人不幸的。 – zhouyu

+0

您需要找到有权修改架构的人员。他们犯了一个错误;是时候修复它了。 – duffymo