MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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 で降順に並べ替えるのが基本パターンです。大量のデータから頻出値を素早く把握できるため、データ分析やデータクレンジングの前調査などにも役立つテクニックです。

  1. MySQLで重複するタプルを検出してカウントを表示する方法

    MySQLで重複するタプル(同じ値の組み合わせを持つ行)を検出し、その出現回数を表示するには、GROUP BY句とHAVING句を組み合わせて使用します。この記事では、テーブルの作成から重複検出クエリの実行まで、手順を追って解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.80 sec) テストデータの挿入

  2. MySQLでテーブル内の各レコードの出現回数をカウントし、結果を新しい列として表示する方法

    MySQLのテーブル内で同じ値が何回出現するかをカウントし、その結果を新しい列として表示したい場合があります。このような集計処理には、COUNT(*)関数とGROUP BY句を組み合わせて使用します。 サンプルテーブルの作成 まず、動作確認用のテーブルを作成しましょう。 mysql> create table DemoTable1942 ( Value int ); Query OK, 0 rows affected (0.00 sec) INSERTコマンドを使って、いくつかのレコードを挿入します。 mysql> insert into DemoTable