SQL,如何使用GROUP BY删除重复数据

时间:2014-03-04 19:28:50

标签: mysql sql

我有一个包含这样的详细信息的表,person_item(id,person_id,item_name,value)。对于某些person_id和item_name,这应该是唯一的,这意味着如果我运行sql脚本,

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

所有选择应该只有一个。但是,我发现重复数据,并且对于每个person_id和item_name对,有时它显示多于1行。我想做的是保留每个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脚本。谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

2.您必须在编辑>中禁用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;

N.B。如果您是创建架构的人 - 可能您不能删除数据 - 所以之前 你试试这个,一定要在游戏区域进行。