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)