MySQLでざっくりとしたヒストグラムを書く

MySQLでもヒストグラム的なものをサクッと作ることが出来るらしい。これならいちいちCSV化してExcelに貼り付けて〜〜みたいなことまでしなくても簡単にデータの分布が見れる。

SELECT ROUND(numeric_value, -2)    AS bucket,
       COUNT(*)                    AS COUNT,
       RPAD('', LN(COUNT(*)), '*') AS bar
FROM   my_table
GROUP  BY bucket;

ROUNDで数値のカラムの値を丸めてRPADでバーを描画。 RPAD( 文字列1, 文字数, 文字列2 )という使い方で本来は第一引数の文字列を表示するために第三引数でパディングを埋めるための関数らしいけど、この場合第一引数を空にして任意の数だけバーを描画するようにしていて賢い。 バーの長さはカウント数の自然対数で正規化していて割りとそれっぽい値に見える。

+--------+----------+-----------------+
| bucket | count    | bar             |
+--------+----------+-----------------+
|   -500 |        1 |                 |
|   -400 |        2 | *               |
|   -300 |        2 | *               |
|   -200 |        9 | **              |
|   -100 |       52 | ****            |
|      0 |  5310766 | *************** |
|    100 |    20779 | **********      |
|    200 |     1865 | ********        |
|    300 |      527 | ******          |
|    400 |      170 | *****           |
|    500 |       79 | ****            |
|    600 |       63 | ****            |
|    700 |       35 | ****            |
|    800 |       14 | ***             |
|    900 |       15 | ***             |
|   1000 |        6 | **              |
|   1100 |        7 | **              |
|   1200 |        8 | **              |
|   1300 |        5 | **              |
|   1400 |        2 | *               |
|   1500 |        4 | *               |
+--------+----------+-----------------+

引用元: Rational Relational: How to Quickly Create a Histogram in MySQL