BigQueryとかでログっぽいものを集計する時のアイデアメモ。
こういうのは名前が決まってると会話しやすいんだけど、なんか必殺技名ないものかしら。
元データのイメージ
以下のようなテーブルにログ的なデータが入ってたとする。
logs
| created | path | message |
|---|---|---|
| 2017-01-01 00:00:00.0123 | /foo | なんか適当な付加情報 |
| 2017-01-01 00:00:01.1234 | /baa | なんか適当な付加情報 |
| 2017-01-01 00:00:02.0123 | /baa | なんか適当な付加情報 |
| ... |
これを時刻ごとに区切って、◯時台だと/fooに何回、/baaに何回、アクセスがあったよーみたいなのを計算したい。
どう書きますか?
私の回答
要件によるんだけど、pathのパターンが数種類だけで決まっているなら、すごく簡単な1個のSQLで作れる。
ここではBigQueryの関数を使っているけれど、時刻の関数はどのRDBMSにもついてるだろうし、たぶん似たような発想で作れると思う。
SELECT UTC_USEC_TO_HOUR(created) AS period
, SUM(path = '/foo') AS foo
, SUM(path = '/baa') AS baa
, SUM(path = '/moo') AS moo
FROM logs
WHERE created BETWEEN '2017-01-01' AND '2017-01-02'
GROUP BY period
ORDER BY period
こういう感じのデータが取れるはず。
| hour | foo | baa | moo |
|---|---|---|---|
| 2017-01-01 00 | 112 | 2523 | 321 |
| 2017-01-01 01 | 90 | 2121 | 123 |
| ... |
ポイントはアクセス数を出すときにCOUNTじゃなくてSUMを使うこと。trueは1としてカウントされ、falseなら0でカウント対象にならない。