読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

プログラミングの話や自分の考えを色々と書いています。特にperl、emacsや読んだ本の話が多いです。

MySQLを使って簡易的にサービスの数値を集計する

tech

最近色んな機能を作る時に、簡単に数値を集計してみて様子を見るということがよくあった。そこで今回はその時に使ったクエリの紹介。

日間の作成数の集計

1日このアクションが何回行われたかとかが集計できる。date_columnにはcreatedみたいなカラムを指定し、table_nameには集計したいテーブルを入れる。他にもCOUNTの仕方を工夫したらいろいろ集計できそう。

SELECT DATE(date_column) as date, COUNT(*) as count FROM table_name GROUP BY DATE(date_column);

週間の作成数の集計

上記日間の週間版。

SELECT YEARWEEK(date_column) as `yearweek`, COUNT(*) as count FROM table_name GROUP BY YEARWEEK(date_column);

1時間ごとの集計

日間集計をさらに1時間単位にしたい時に。時間カラムとSUBSTRを使うといろいろ出来て便利ですね。

SELECT SUBSTR(date_column, 1, 13) as `yeardayhour`, count(*) as count FROM table_name GROUP BY SUBSTR(created_at, 1, 13);

どの時間帯に作成されているか集計

何時の時間帯が一番活発か知りたい時に。

SELECT SUBSTR(date_column, 12, 2) as `hour`, count(*) as count FROM table_name GROUP BY SUBSTR(date_column, 12, 2);

どの曜日に作成されているか集計

今度は何曜日に活発か知りたい時に。

SELECT DAYNAME(date_column) as `dayname`, count(*) as count FROM table_name GROUP BY DAYNAME(date_column);

数字の桁数ごとの集計

例えば、文字数がどの範囲に収まっているかとかのヒストグラムを簡単に出したいときとかに。number_columnは数字が入っているカラムを指定しましょう。

SELECT CHAR_LENGTH(number_column) as number_of_digit, COUNT(*) as count FROM table_name GROUP BY CHAR_LENGTH(number_column);

まとめ

MySQLの関数をいろいろ使うと簡単にいろんな集計ができて便利。

また最近createdとかupdatedなカラムを全てのテーブルに入れるのはどうなのかという話も出ていましたが、こういうことがぱぱっと出来たり、後から追加するのはだるいとかいう問題もあって、容量やパフォーマンスの問題がなければ何も考えずに付ける派です。時間系カラムの最近の考えについては、また機会があったら書きます。