sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLのテーブルに欠落している日付を追加する

    日付 予約語 です。 標準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)
    


    1. ブラックホールに相当するものは何ですか?

    2. PHPを使用してプライベートメッセージングシステムを構築する方法に関するチュートリアルを探しています

    3. MySQLでデータを生成する方法は?

    4. Laravel-Paginateランダムレコード