date
é uma palavra reservada
no SQL padrão e o nome de um tipo de dados no PostgreSQL. O PostgreSQL o permite como identificador, mas isso não o torna uma boa ideia. Eu uso thedate
como nome da coluna. Não confie na ausência de lacunas em um ID substituto. Isso é quase sempre uma má ideia. Trate tal ID como número único sem significado , mesmo que pareça ter outros atributos na maioria das vezes .
Nesse caso específico, como @ Clodoaldo comentou ,
thedate
parece ser uma chave primária perfeita e a coluna id
é apenas cruft - que eu removi:CREATE TEMP TABLE tbl (thedate date PRIMARY KEY, rainfall numeric);
INSERT INTO tbl(thedate, rainfall) VALUES
('2002-05-06', 110.2)
, ('2002-05-07', 56.6)
, ('2002-05-09', 65.6)
, ('2002-05-10', 75.9);
Consulta
Tabela completa por consulta:
SELECT x.thedate, t.rainfall -- rainfall automatically NULL for missing rows
FROM (
SELECT generate_series(min(thedate), max(thedate), '1d')::date AS thedate
FROM tbl
) x
LEFT JOIN tbl t USING (thedate)
ORDER BY x.thedate
Semelhante ao que @a_horse_with_no_name postado, mas simplificado e ignorando o
id
removido . Preenche as lacunas entre a primeira e a última data encontradas na tabela. Se houver lacunas de avanço/atraso, estenda de acordo. Você pode usar
date_trunc()
como @Clodoaldo
demonstrado - mas sua consulta sofre de erros de sintaxe e pode ser mais simples. INSERIR linhas ausentes
A maneira mais rápida e legível de fazer isso é um
NOT EXISTS
anti-semi-junção. INSERT INTO tbl (thedate, rainfall)
SELECT x.thedate, NULL
FROM (
SELECT generate_series(min(thedate), max(thedate), '1d')::date AS thedate
FROM tbl
) x
WHERE NOT EXISTS (SELECT 1 FROM tbl t WHERE t.thedate = x.thedate)