MySQLで特定の列の重複データ件数を集計し、降順に並べ替える方法
MySQLである列(カラム)に含まれる重複レコードの件数を調べ、その結果を並べ替えて表示したい場面はよくあります。例えば、アンケートの回答値やログデータの中で、どの値が何回出現したかを把握したい場合などです。
基本となるSQL構文
重複レコードの件数を集計するには、対象の列名に対して GROUP BY を使用します。件数を取得するには COUNT(*) を使い、結果を並べ替えるには ORDER BY を組み合わせます。基本的な構文は以下のとおりです。
SELECT COUNT(*) AS 任意の別名 FROM テーブル名 GROUP BY 列名 ORDER BY 別名 DESC;
ポイントは次の3つです。
- GROUP BY:同じ値を持つ行をグループ化します
- COUNT(*):各グループの行数(出現回数)を数えます
- ORDER BY ~ DESC:出現回数の多い順(降順)に並べ替えます
サンプルテーブルの作成
まず、動作を確認するためのテーブルを作成しましょう。ここでは整数型の「Number」という列を1つだけ持つシンプルなテーブルを用意します。
mysql> create table DemoTable
(
Number int
);
Query OK, 0 rows affected (0.82 sec)
テストデータの挿入
次に、INSERT文を使って重複を含むレコードをいくつか登録します。あえて同じ値を複数回挿入することで、重複集計の動きがわかりやすくなります。
mysql> insert into DemoTable values(90); Query OK, 1 row affected (0.26 sec) mysql> insert into DemoTable values(100); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable values(110); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable values(90); Query OK, 1 row affected (0.16 sec) mysql> insert into DemoTable values(100); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable values(90); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable values(120); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(100); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable values(90); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable values(120); Query OK, 1 row affected (0.13 sec)
登録済みレコードの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行すると、次のような結果が出力されます。
+--------+ | Number | +--------+ | 90 | | 100 | | 110 | | 90 | | 100 | | 90 | | 120 | | 100 | | 90 | | 120 | +--------+ 10 rows in set (0.00 sec)
この時点では、90・100・110・120という4種類の値が、合計10行分バラバラに格納されていることが確認できます。
重複件数を集計して並べ替えるクエリ
いよいよ本題です。各値の出現回数を集計し、多い順に並べ替えて表示するには、次のクエリを実行します。
mysql> select count(*) as Occured from DemoTable group by Number order By Occured DESC;
実行結果は以下のとおりです。
+---------+ | Occured | +---------+ | 4 | | 3 | | 2 | | 1 | +---------+ 4 rows in set (0.00 sec)
結果の読み方
この出力から、次のことが読み取れます。
- 90 → 4回出現
- 100 → 3回出現
- 120 → 2回出現
- 110 → 1回のみ出現
ORDER BY Occured DESC を指定しているため、出現回数の多い順に並んでいます。逆に少ない順にしたい場合は ASC(昇順)に変更してください。
応用:どの値が何回出現したかも一緒に表示する
実務では「件数だけでなく、どの値か」も知りたいケースがほとんどです。その場合は、GROUP BYで指定した列をSELECT句にも追加します。
mysql> select Number, count(*) as Occured from DemoTable group by Number order By Occured DESC;
こうすることで、値と出現回数をセットで確認でき、より実用的な集計結果になります。
まとめ
MySQLで列内の重複レコード件数を集計するには、GROUP BY でグループ化し、COUNT(*) で件数を数え、ORDER BY ~ DESC で降順に並べ替えるのが基本パターンです。大量のデータから頻出値を素早く把握できるため、データ分析やデータクレンジングの前調査などにも役立つテクニックです。
-
MySQLで重複するタプルを検出してカウントを表示する方法
MySQLで重複するタプル(同じ値の組み合わせを持つ行)を検出し、その出現回数を表示するには、GROUP BY句とHAVING句を組み合わせて使用します。この記事では、テーブルの作成から重複検出クエリの実行まで、手順を追って解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.80 sec) テストデータの挿入
-
MySQLでテーブル内の各レコードの出現回数をカウントし、結果を新しい列として表示する方法
MySQLのテーブル内で同じ値が何回出現するかをカウントし、その結果を新しい列として表示したい場合があります。このような集計処理には、COUNT(*)関数とGROUP BY句を組み合わせて使用します。 サンプルテーブルの作成 まず、動作確認用のテーブルを作成しましょう。 mysql> create table DemoTable1942 ( Value int ); Query OK, 0 rows affected (0.00 sec) INSERTコマンドを使って、いくつかのレコードを挿入します。 mysql> insert into DemoTable