このためにCTEは必要ありません。必要以上に費用がかかります。
そして、timestamp
にキャストする必要はありません。 、結果はすでに データ型のtimestamp
timestamp
をフィードするとき generate_series()
に入力します 。詳細はこちら:
- PostgreSQLで2つの日付間の時系列を生成する
Postgresで9.3 以降、LATERAL
を使用できます 参加:
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);
オプションでto_char()
を使用 言及した形式のテキストとして結果を取得します。
これは任意ので機能します Postgresバージョン:
SELECT generate_series(min(start_timestamp)
, max(start_timestamp)
, interval '1 hour') AS ts
FROM header_table;
通常は少し高速です。SELECT
でset-returning関数を呼び出す listは非標準のSQL機能であり、一部の人からは嫌われています。また、Postgres 10で最終的に修正された動作上の奇妙な点がありました(この単純なケースではありませんが)。参照:
- SELECT句で複数のセットを返す関数に期待される動作は何ですか?
注 NULLの微妙な違い 取り扱い:
に相当
max(start_timestamp)
で取得されます
ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1
NULLS LAST
なし NULL値は最初になります 降順(できる場合 start_timestamp
ではNULL値である )。 last_date
の場合はNULLになります クエリは空になります。
詳細:
- PostgreSQLクエリでDESCを注文するときにNULL値が最初に来るのはなぜですか?