2016-07-12 206 views
0

有什么办法在mysql中通过语句获得组的反转吗?我的用例是删除所有重复项。GROUP BY inverse(mysql)

说我的表看起来像这样:

ID | columnA | ... 
1 | A 
2 | A 
3 | A 
4 | B 
5 | B 
6 | C 

我希望我的结果集是这样的:

ID | columnA | ... 
2 | A 
3 | A 
5 | B 

(本质上,这找到所有副本留下一个在后面可以用来清洗。所有重复的记录降至1,或稍后执行其他分析)。

+0

您的表格没有重复的内容...您是什么意思的“重复”? – nosbor

+2

“你想要”的结果集有重复(A存在两次) –

+0

这是怎么回事?这正是GROUP BY所做的,它将所有重复项组合成一行。 – Barmar

回答

0

一种方式是采取一切,但第一个ID为ColumnA每个值:

select t.* 
from t 
where t.id > (select min(t2.id) from t t2 where t2.columnA = t.columnA); 
0

这应该表现得更好了很多然后内心的选择基于查询。

SELECT 
    * 
FROM 
    TABLE 
QUALIFY 
    RANK() OVER (partition by columnA order by ID ASC) = 1 

编辑:这显然不会在MySQL中工作。猜测唯一的答案是通过oracle许可证 - 或者使用其他答案。 ;)

+0

MySQL可以做到吗? – sstan

+0

难道不是吗?如果不能,那将会令人失望。 – gbtimmon

+1

准备好失望:) – sstan

0

你的结果似乎

select max(id), columnA group by columnA 
0

我实现了一个基于@scaisEdge响应自己的解决方案之前,他编辑了。需要与我的群组相反,所以使用子查询:

SELECT * FROM mytable WHERE ID NOT IN (SELECT ID FROM mytable GROUP BY columnA); 
+0

因此,您确实希望查询返回重复项,而不是其他方式......我认为您只是困惑了一些人。 – sstan

+0

这个问题说“留下一个”。该解决方案从每个组中删除1行,所以它会留下多行。 – Barmar

+0

对不起,我的措辞不是最好的,但我的例子正确地显示我想要的。 – user3726494

0

我相信这会有所帮助。

create table test.temptable select distinct * from YourTable; 
    truncate YourTable; 
    insert into YourTable select * from test.temptable ;