sql >> Databáze >  >> RDS >> PostgreSQL

přidání chybějícího data do tabulky v PostgreSQL

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)


  1. Ekvivalent klauzule MySQL LIMIT pro SQL SERVER

  2. Jak používat MySQL a MSSQL společně ve zdroji dat Grails?

  3. Codeigniter $this->db->reconnect(); používání

  4. Prostorová vzdálenost Mysql pomocí POINT - Nefunguje