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)