勉強したことのメモ

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

  関連記事

WordPressサイトのロードアベレージが高い際の対応方法
WordPressサイトのロードアベレージが高い際の対応方法

あるWordPressサイトのロードアベレージが先月ぐらいまでは通常0.5前後で ...

MySQLでtime型データからint型データの減算を行い、減算後のデータで条件検索する方法
MySQLでtime型データからint型データの減算を行い、減算後のデータで条件検索する方法

MySQLでtime型データからint型データの減算を行い、減算後のデータを検索 ...

MySQLにて指定したカラムがNULLもしくは空の場合、あらかじめ決めておいた内容で表示する方法
MySQLにて指定したカラムがNULLもしくは空の場合、あらかじめ決めておいた内容で表示する方法

何らかのフォームとMySQLを組み合わせた際に任意入力の項目はそのカラムがNUL ...

MySQLでCSVから列を指定してインポート
MySQLでCSVから列を指定してインポート

MySQLでCSVからデータをインポートしたかった。またエクセル風にいうA列はi ...

MySQLで特定の値を加算しつつNULL値の場合は0にする方法
MySQLで特定の値を加算しつつNULL値の場合は0にする方法

いくつかのコードに対して投票を行い、その合計値をスコアとして出したい。ただ、投票 ...