sql >> Base de Datos >  >> RDS >> PostgreSQL

agregando la fecha que falta en una tabla en PostgreSQL

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)