勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

MySQLで指定したカラムの最頻値を抽出する方法

  MySQL データベース

MySQLで指定したカラムの最頻値(全データの中で最も多く出現する値)を抽出したいというケースがあった。ざっと調べたところ最頻値を求める関数というのは見受けられなかったためSQL文で何とかしないといけないっぽい。以下に対応方法をメモ。

 

テーブル構造

mysql> SHOW COLUMNS FROM `test_table`;
+-------+------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra          |
+-------+------+------+-----+---------+----------------+
| id    | int  | NO   | PRI | NULL    | auto_increment |
| score | int  | NO   |     | NULL    |                |
+-------+------+------+-----+---------+----------------+

 

データ内容

mysql> SELECT * FROM `test_table` ORDER BY `score` DESC;
+----+-------+
| id | score |
+----+-------+
|  1 |   100 |
|  4 |    80 |
|  5 |    70 |
| 10 |    70 |
|  3 |    60 |
|  7 |    55 |
|  6 |    50 |
|  2 |    40 |
| 11 |    30 |
|  8 |    20 |
|  9 |    20 |
+----+-------+

 

対応方法

SQL文

SELECT score, COUNT(*) AS cnt
FROM `test_table`
GROUP BY `score`
HAVING COUNT(*) >= ALL ( SELECT COUNT(*) AS cnt FROM `test_table` GROUP BY `score`);

出力結果

上記SQL文を実行すると以下が出力される筈。

+-------+-----+
| score | cnt |
+-------+-----+
|    70 |   2 |
|    20 |   2 |
+-------+-----+

 

参考サイト

https://qiita.com/ryosuketter/items/0e06ffc4251e78bf27be

 - MySQL データベース

  関連記事

MySQLでテーブル構造とデータをコピーする方法
MySQLでテーブル構造とデータをコピーする方法

MySQLで既にあるテーブルとデータに対して実験を行う必要があった。本番テーブル ...

MySQLでホスト指定しても正常に接続できない場合
MySQLでホスト指定しても正常に接続できない場合

MySQL自体は動いており、ユーザーも登録されているのに、ホスト名を指定しても正 ...

MySQLでテキスト(日本語、半角英数字)を暗号化・復号化する方法
MySQLでテキスト(日本語、半角英数字)を暗号化・復号化する方法

MySQLでデータを登録する際に暗号化したいというケースがあった。対象のデータは ...

MySQLでデータベース単位とテーブル単位のデータサイズ(容量)の調べ方
MySQLでデータベース単位とテーブル単位のデータサイズ(容量)の調べ方

VPSの各種ファイルを整理している際に「MySQLも不要なデータを削除すればいい ...

MySQLで月別に集計を行う。あと日付時刻関数。
MySQLで月別に集計を行う。あと日付時刻関数。

現在進行形でやっているデータ集計系だけど 新たな発見があったのでメモ。 ■日付時 ...