PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

menambahkan tanggal yang hilang dalam tabel di PostgreSQL

date adalah kata yang dicadangkan dalam SQL standar dan nama tipe data di PostgreSQL. PostgreSQL mengizinkannya sebagai pengenal, tetapi itu bukan ide yang bagus. Saya menggunakan date sebagai nama kolom sebagai gantinya.

Jangan mengandalkan tidak adanya celah dalam ID pengganti. Itu hampir selalu merupakan ide yang buruk. Perlakukan ID tersebut sebagai nomor unik tanpa arti , meskipun tampaknya membawa atribut tertentu lainnya sebagian besar waktu .

Dalam kasus khusus ini, sebagai @ Clodoaldo berkomentar , date tampaknya menjadi kunci utama yang sempurna dan kolom id hanya cruft - yang saya hapus:

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);

Kueri

Tabel lengkap berdasarkan kueri:

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

Mirip dengan @a_horse_with_no_name diposting, tetapi disederhanakan dan mengabaikan id . yang dipangkas .

Mengisi celah antara tanggal pertama dan terakhir yang ditemukan di tabel. Jika ada celah terdepan / tertinggal, perpanjang sesuai. Anda dapat menggunakan date_trunc() seperti @Clodoaldo didemonstrasikan - tetapi kuerinya mengalami kesalahan sintaks dan bisa lebih sederhana.

MASUKKAN baris yang tidak ada

Cara tercepat dan paling mudah dibaca untuk melakukannya adalah NOT EXISTS anti-semi-gabung.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. currval belum didefinisikan sesi ini, bagaimana cara mendapatkan urutan multi-sesi?

  2. Bagaimana Anda menulis kueri case-insensitive untuk MySQL dan Postgres?

  3. PostgreSQL tidak dapat memanggil json_object_keys pada skalar

  4. Sekuel dan otentikasi rekan untuk Postgres?

  5. Cara membuat daftar tabel dalam database saat ini menggunakan PostgreSQL