Tenho desigualmente distribuído de dados (data wrt) por alguns anos (2003-2008). Quero consultar dados para um determinado conjunto de início e data final, que agrupa os dados por qualquer um dos intervalos suportados (dia, semana, mês, trimestre, ano) em PostgreSQL 8.3 ( http://www.postgresql.org/docs /8.3/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC ).
O problema é que algumas das consultas dar resultados contínua ao longo do período exigido, como este:
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)
mas alguns deles perca alguns intervalos, porque não há dados presentes, como este:
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)
onde o conjunto de resultados necessária é:
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)
Uma contagem de 0 para entradas faltando.
Eu vi discussões anteriores sobre estouro de pilha, mas eles não resolver o meu problema que parece, desde o meu período de agrupamento é um dos (dia, semana, mês, trimestre, ano) e decidiu, em tempo de execução pelo aplicativo. Assim, uma abordagem como associação à esquerda com uma mesa de calendário ou tabela de seqüência não vai ajudar, eu acho.
Minha solução atual para isso é para preencher essas lacunas em Python (em um Turbogears App), utilizando o módulo de calendário.
Existe uma maneira melhor de fazer isso.













