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?