Anda tidak memerlukan CTE untuk ini, itu akan lebih mahal dari yang diperlukan.
Dan Anda tidak perlu menggunakan timestamp
, hasilnya sudah adalah tipe data timestamp
saat Anda memberi makan timestamp
ketik ke generate_series()
. Detailnya di sini:
- Membuat deret waktu antara dua tanggal di PostgreSQL
Di Postgres 9.3 atau nanti Anda dapat menggunakan LATERAL
bergabung:
SELECT to_char(ts, 'YYYY-MM-DD HH24') AS formatted_ts
FROM (
SELECT min(start_timestamp) as first_date
, max(start_timestamp) as last_date
FROM header_table
) h
, generate_series(h.first_date, h.last_date, interval '1 hour') g(ts);
Opsional dengan to_char()
untuk mendapatkan hasil sebagai teks dalam format yang Anda sebutkan.
Ini berfungsi di apa saja Versi Postgres:
SELECT generate_series(min(start_timestamp)
, max(start_timestamp)
, interval '1 hour') AS ts
FROM header_table;
Biasanya sedikit lebih cepat.
Memanggil fungsi pengembalian set di SELECT
list adalah fitur SQL non-standar dan disukai oleh beberapa orang. Juga, ada keanehan perilaku (meskipun tidak untuk kasus sederhana ini) yang akhirnya diperbaiki di Postgres 10. Lihat:
- Apa perilaku yang diharapkan untuk beberapa fungsi pengembalian-set dalam klausa SELECT?
Catatan perbedaan halus dalam NULL penanganan:
Setara dengan
max(start_timestamp)
diperoleh dengan
ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1
Tanpa NULLS LAST
Nilai NULL datang lebih dulu dalam urutan menurun (jika ada bisa menjadi nilai NULL di start_timestamp
). Anda akan mendapatkan NULL untuk last_date
dan kueri Anda akan kosong.
Detail:
- Mengapa nilai NULL didahulukan saat memesan DESC dalam kueri PostgreSQL?