sql >> Database teknologi >  >> RDS >> PostgreSQL

tilføje manglende dato i en tabel i PostgreSQL

date er et reserveret ord i standard SQL og navnet på en datatype i PostgreSQL. PostgreSQL tillader det som identifikator, men det gør det ikke til en god idé. Jeg bruger thedate som kolonnenavn i stedet.

Stol ikke på fraværet af huller i et surrogat-id. Det er næsten altid en dårlig idé. Behandl et sådant ID som unikt nummer uden betydning , selvom det ser ud til at bære visse andre attributter det meste af tiden .

I dette særlige tilfælde, som @ Clodoaldo kommenterede , thedate ser ud til at være en perfekt primær nøgle og kolonnen id er bare cruft - som jeg fjernede:

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);

Forespørgsel

Fuld tabel efter forespørgsel:

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

Svarende til hvad @a_horse_with_no_name indsendt, men forenklet og ignorerer det beskårne id .

Udfylder huller mellem første og sidste dato fundet i tabellen. Hvis der kan være førende/efterslæbende huller, forlænges i overensstemmelse hermed. Du kan bruge date_trunc() synes godt om @Clodoaldo demonstreret - men hans forespørgsel lider af syntaksfejl og kan være enklere.

INDSÆT manglende rækker

Den hurtigste og mest læsbare måde at gøre det på er en NOT EXISTS anti-semi-join.

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)


  1. Anmodning indstillet i Concurrent Manager

  2. `~` (tilde) operator i boolsk fuldtekstsøgning i MySQL opfører sig ikke som angivet på MySQL-udviklerwebstedet

  3. Fjern efterfølgende decimal nul

  4. Hvor meget RAM har din nye databaseserver brug for?