date
je rezervované slovo
ve standardním SQL a název datového typu v PostgreSQL. PostgreSQL to umožňuje jako identifikátor, ale to není dobrý nápad. Používám thedate
jako název sloupce.
Nespoléhejte na absenci mezer v náhradním průkazu totožnosti. To je skoro vždy špatný nápad. Považujte takové ID za jedinečné číslo bez významu , i když se zdá, že většinou nese určité další atributy .
V tomto konkrétním případě jako @ Clodoaldo komentoval
, date
se zdá být dokonalý primární klíč a sloupec id
je jen cruft - který jsem odstranil:
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);
Dotaz
Celá tabulka podle dotazu:
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
Podobné jako @a_horse_with_no_name
odeslané, ale zjednodušené a ignorující oříznuté id
.
Doplní mezery mezi prvním a posledním datem v tabulce. Pokud se mohou vyskytnout mezery vpředu/zaostávání, prodlužte odpovídajícím způsobem. Můžete použít date_trunc()
jako @Clodoaldo
demonstrováno - ale jeho dotaz trpí syntaktickými chybami a může být jednodušší.
VLOŽTE chybějící řádky
Nejrychlejší a nejčitelnější způsob, jak to udělat, je 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)