MySQL的删除重复的连续行
假设该表:MySQL的删除重复的连续行
ID ColA ColB
1 7 8
2 7 9
3 7 9
4 5 8
5 6 9
6 6 9
7 5 4
的PK是ID coumn。 现在,我想删除连续行中的所有重复项ColA
和ColB
。
在此示例中,第2,3和5,6行包含重复项。 这些将被删除,以便保留更高的ID。
输出应该是:
ID ColA ColB
1 7 8
3 7 9
4 5 8
6 6 9
7 5 4
这怎么能与MySQL做什么?
感谢, 克林斯曼
select ID from MyTable m1 where 0 < (select count(*) from MyTable m2 where m2.ID = m1.ID - 1 and m2.ColA = m1.ColA and m2.ColB = m1.ColB)
,然后你可以使用一个
delete from MyTable where ID in ...
查询。这样它肯定能在任何版本中工作。
取决于你有多少条记录有,这可能不是最有效的:
SELECT (SELECT TOP 1 id FROM table WHERE colA = m.colA AND colB = m.colB ORDER BY id DESC) AS id, m.*
FROM (SELECT DISTINCT colA, colB
FROM table) m
,因为我通常使用MSSQL可能有语法错误,但这个想法应该是相似的。
MySQL中没有top关键字,而是使用Limit。另外,您不要删除重复项目。此外,您的选择甚至不会选择问题中定义的重复项(连续的ID,除序列中的第一个外)。我很抱歉,但我不得不让你失望。 –
哎呀,我错过了删除部分。误读它,是的,我应该使用LIMIT而不是TOP;这是我的MS东西踢英寸但如果你删除tabe WHERE NOT IN(上面的查询),你会留下不在嵌套选择的ID,并且嵌套选择选择第一个最高的ID,因为我命令通过,我们只选择第一个。只要删除m。*。 – JohnathanKong
我称之为第一个'测试'表。
首先创建一个表,将举行可乐COLB的所有相同的组合:
create temporary table tmpTable (ColA int, ColB int);
insert into tmpTable select ColA,ColB from test group by ColA, ColB;
现在,选择在原表中最大的ID为可乐COLB的每个相同的组合。要把它放到一个新的表(称为idsToKeep因为这些行,我们不希望删除):
create temporary table idsToKeep (ID int);
insert into idsToKeep select (select max(ID) from test where test.ColA=tmpTable.ColA and test.ColB=tmpTable.ColB) from tmpTable;
最后,删除所有数据从原始表不在idsToKeep表中的条目:
delete from test where ID <> all (select ID from idsToKeep);
CREATE TEMPORARY TABLE duplicates (id int primary key)
INSERT INTO duplicates (id)
SELECT t1.id
FROM table t1
join table t2 on t2.id = t1.id + 1
WHERE t1.ColA = t2.ColA
and t1.ColB = t2.ColB
-- SELECT * FROM duplicates --> are you happy with that? => delete
DELETE table
FROM table
join duplicates on table.id = duplicates.id
对不起,但你有没有尝试过,或者至少有点想过? –