Я неравномерно распределил данные (по дате) за несколько лет (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 для пропущенных записей.
Я видел предыдущие дискуссии о переполнении стека, но, похоже, они не решают мою проблему, поскольку мой период группировки - один из (день, неделя, месяц, квартал, год), и он был выбран приложением во время выполнения. Таким образом, такой подход, как левое соединение с таблицей календаря или таблицей последовательности, не поможет, я думаю.
Мое текущее решение - заполнить эти пробелы в Python (в приложении Turbogears) с помощью модуля календаря.
Есть ли лучший способ сделать это.