PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

adicionando data ausente em uma tabela no PostgreSQL


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)