Du behöver ingen CTE för detta, det skulle bli dyrare än nödvändigt.
Och du behöver inte casta till timestamp
, resultatet är redan av datatypen timestamp
när du matar timestamp
typer till generate_series()
. Detaljer här:
- Genererar tidsserier mellan två datum i PostgreSQL
I Postgres 9.3 eller senare kan du använda en LATERAL
gå med:
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);
Valfritt med to_char()
för att få resultatet som text i det format du nämnde.
Detta fungerar i alla Postgres version:
SELECT generate_series(min(start_timestamp)
, max(start_timestamp)
, interval '1 hour') AS ts
FROM header_table;
Vanligtvis lite snabbare.
Anropar set-returnerande funktioner i SELECT
list är en icke-standard-SQL-funktion och ogillas av vissa. Det fanns också beteendemässiga konstigheter (men inte för detta enkla fall) som så småningom fixades i Postgres 10. Se:
- Vad är det förväntade beteendet för flera set-returfunktioner i SELECT-satsen?
Obs en subtil skillnad i NULL hantering:
Motsvarigheten till
max(start_timestamp)
erhålls med
ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1
Utan NULLS LAST
NULL-värden kommer först i fallande ordning (om det kan). vara NULL-värden i start_timestamp
). Du skulle få NULL för last_date
och din fråga skulle bli tom.
Detaljer:
- Varför kommer NULL-värden först när man beställer DESC i en PostgreSQL-fråga?