日付コード> 予約語
です。 標準SQLおよびPostgreSQLのデータ型の名前。 PostgreSQLはそれを識別子として許可しますが、それは良い考えではありません。
thedate
を使用しています 代わりに列名として。
サロゲートIDにギャップがないことに依存しないでください。それはほとんどの場合悪い考えです。このようなIDを意味のない一意の番号として扱います 、他の特定の属性を持っているように見える場合でも、ほとんどの場合 。
この特定のケースでは、 @ Clodoaldoがコメントしました
、 thedate
完全な主キーと列id
のようです ただのがらくたです-私が削除しました:
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);
クエリ
クエリによる完全なテーブル:
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
@a_horse_with_no_name
と同様です 投稿されましたが、簡略化され、削除された id
は無視されます 。
表にある最初の日付と最後の日付の間のギャップを埋めます。先行/遅延ギャップがある可能性がある場合は、それに応じて拡張します。 date_trunc()
を使用できます @Clodoaldo
のように 実証済み-しかし、彼のクエリは構文エラーに悩まされており、より単純になる可能性があります。
欠落している行を挿入
それを行うための最も速くて読みやすい方法は、 NOT EXISTS
です。 反半結合。
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)