2016-07-12 14 views
0

mysqlのgroup by文の逆を得る方法はありますか?私のユースケースは、すべての重複を削除することです。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は2回あります) –

+0

これはグループの逆数です。これはまさにGROUP BYが行うことであり、すべての重複を1つの行にまとめます。 – Barmar

答えて

0

一つの方法は、すべてが、ColumnAの各値の最初のIDを取ることです。

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では機能しません。オラクルのライセンスによって唯一の答えがあると思う - または別の答えを使用してください。 ;)

+0

MySQLはこれを実行できますか? – sstan

+0

できませんか?それが傾けばそれはdissapointingだろう。 – gbtimmon

+1

失望する準備ができている:) – sstan

0

あなたの結果は、彼がそれを編集した前に、私は@scaisEdge応答に基づいて自分自身のソリューションを実現

select max(id), columnA group by columnA 
0

ようです。ではそのサブクエリを使用して、私のことでグループの反対を必要とする:

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

あなたはクエリが重複を返すようにしましたが、他の方法では返しませんでした。 – sstan

+0

質問は「1つ後ろに残す」と言っています。このソリューションは、各グループから1行を削除するので、複数の行が残されます。 – Barmar

+0

申し訳ありませんが、私の言葉は最高ではありませんでしたが、私の例は私が望むものを正しく表示していました。 – user3726494

0

私は、これが役立ちます確信しています。

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