date es una palabra reservada
en SQL estándar y el nombre de un tipo de datos en PostgreSQL. PostgreSQL lo permite como identificador, pero eso no lo convierte en una buena idea. Uso thedate como nombre de columna en su lugar.
No confíe en la ausencia de lagunas en una identificación sustituta. Eso es casi siempre una mala idea. Trate dicha identificación como número único sin significado , incluso si parece tener otros atributos la mayor parte del tiempo .
En este caso particular, como @ Clodoaldo comentó
, thedate parece ser una clave principal perfecta y la columna id es simplemente cruft, que eliminé:
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
Tabla 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
Similar a lo que @a_horse_with_no_name
publicado, pero simplificado e ignorando el id eliminado .
Rellena los espacios entre la primera y la última fecha que se encuentran en la tabla. Si puede haber brechas principales/rezagadas, extiéndalas en consecuencia. Puedes usar date_trunc() como @Clodoaldo
demostrado, pero su consulta adolece de errores de sintaxis y puede ser más simple.
INSERTAR filas faltantes
La forma más rápida y legible de hacerlo es NOT EXISTS anti-semi-unión.
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)