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でカウント対象にならない。