数年間(2003年から2008年)、データ(日付)が不均一に分散しています。PostgreSQL 8.3( http://www.postgresql.org/docs)でサポートされている間隔(日、週、月、四半期、年)のいずれかでデータをグループ化して、特定の開始日と終了日のセットのデータをクエリしたい/8.3/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC)。
問題は、次のように、一部のクエリで必要な期間にわたって継続的な結果が得られることです。
select to_char(date_trunc('month',date), 'YYYY-MM-DD'),count(distinct post_id)
from some_table where category_id=1 and entity_id = 77 and entity2_id = 115
and date <= '2008-12-06' and date >= '2007-12-01' group by
date_trunc('month',date) order by date_trunc('month',date);
to_char | count
------------+-------
2007-12-01 | 64
2008-01-01 | 31
2008-02-01 | 14
2008-03-01 | 21
2008-04-01 | 28
2008-05-01 | 44
2008-06-01 | 100
2008-07-01 | 72
2008-08-01 | 91
2008-09-01 | 92
2008-10-01 | 79
2008-11-01 | 65
(12 rows)
ただし、次のように、データが存在しないため、一部の間隔が欠落しています。
select to_char(date_trunc('month',date), 'YYYY-MM-DD'),count(distinct post_id)
from some_table where category_id=1 and entity_id = 75 and entity2_id = 115
and date <= '2008-12-06' and date >= '2007-12-01' group by
date_trunc('month',date) order by date_trunc('month',date);
to_char | count
------------+-------
2007-12-01 | 2
2008-01-01 | 2
2008-03-01 | 1
2008-04-01 | 2
2008-06-01 | 1
2008-08-01 | 3
2008-10-01 | 2
(7 rows)
必要な結果セットは次のとおりです。
to_char | count
------------+-------
2007-12-01 | 2
2008-01-01 | 2
2008-02-01 | 0
2008-03-01 | 1
2008-04-01 | 2
2008-05-01 | 0
2008-06-01 | 1
2008-07-01 | 0
2008-08-01 | 3
2008-09-01 | 0
2008-10-01 | 2
2008-11-01 | 0
(12 rows)
欠落しているエントリのカウントは0です。
Stack Overflowに関する以前の議論を見たことがありますが、私のグループ化期間は(日、週、月、四半期、年)のいずれかであり、アプリケーションによって実行時間を決定したため、問題は解決しないようです。したがって、カレンダーテーブルまたはシーケンステーブルとの左結合のようなアプローチは、私が推測するのに役立ちません。
これに対する私の現在の解決策は、カレンダーモジュールを使用してPython(Turbogearsアプリ内)でこれらのギャップを埋めることです。
これを行うためのより良い方法はありますか?