勉強したことのメモ

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

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 / MariaDB データベース

  関連記事

エックスサーバーでMySQLのサイズに注意
エックスサーバーでMySQLのサイズに注意

エックスサーバーで自動更新のログをMySQLに保存するようなシステムを動かしてい ...

MySQLにてSELECT時にdate型のカラムから和暦を計算し表示する方法
MySQLにてSELECT時にdate型のカラムから和暦を計算し表示する方法

MySQLにdate型のカラムに誕生年月日が格納されており、そこから和暦を計算し ...

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

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

MySQLのREGEXPで半角記号を検索したい場合の対応方法
MySQLのREGEXPで半角記号を検索したい場合の対応方法

MySQLのREGEXPで半角記号を検索したい場合\\を付けてエスケープしないと ...

MySQLでINSERT時にオートインクリメントではないカラムに連番を登録する方法
MySQLでINSERT時にオートインクリメントではないカラムに連番を登録する方法

MySQLでINSERT時にオートインクリメントではないカラムに連番を登録したい ...