/var/log/laughingman7743.log

I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?

Redshift集計Tipsその1 - カレンダーの活用

その2があるのかは謎
適当な集計すんなksgってことで、以前会社の人に教えてもらいました。ありがとうございます。

日毎に集計を行うことが多いと思いますが、データがない日があると歯抜になり、 Window関数を利用した集計で正しい結果が求められていなかったり、 グラフ表示で歯抜の日をプログラム側で補完する等が必要になったりして非常にめんどくさかったりします。データがない日も網羅的に集計できると便利です。

PostgreSQL9系であれば以下のように簡単にカレンダーの生成ができます。

Postgresqlでカレンダーを使わずに日付を列挙する方法(generate_series)
Postgres generate_series関数によるデータの生成 | Fusic Developers Weblog

RedshiftはPostgreSQL 8.0.2ベース*1で、 GENERATE_SERIES関数はサポートしていない*2とオフシャルドキュメントにあります。 PostgreSQL 8.0系のドキュメントを確認するとGENERATE_SERIES関数はサポートされています*3PostgreSQL 8.4系のドキュメントを確認すると、さらにtimestamp型のサポートがされた形です*4
実際にRedshiftで確認してみると、以下のクエリは結果が返ってきます。

GENERATE_SERIES関数でtimestamp型が使えないだけなので、少し工夫すればカレンダーを生成することが可能です。

集計前にテンプテーブルにカレンダーとマスターデータをCROSS JOINした網羅的なマスタテーブルを生成し、そのマスタテーブルとJOINした集計をすると網羅的な集計ができます。 テンプテーブルはDISTKEYの指定ができるので、DISTSTYLE ALLにしておくと良いです。 圧縮設定も読み込み、書き込みのブロック数を減らせるので忘れずに。

必要なときに必要な範囲のカレンダーは生成できますが、カレンダーテーブルは別途あると非常に便利です。 マスタテーブルとして作成しておいたほうが無難ですね。

Enjoy!