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)