Du behøver ikke en CTE til dette, det ville være dyrere end nødvendigt.
Og du behøver ikke at caste til timestamp
, resultatet er allerede af datatypen timestamp
når du fodrer timestamp
typer til generate_series()
. Detaljer her:
- Generering af tidsserier mellem to datoer i PostgreSQL
I Postgres 9.3 eller senere kan du bruge en LATERAL
deltage:
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);
Eventuelt med to_char()
for at få resultatet som tekst i det format, du nævnte.
Dette virker i alle Postgres version:
SELECT generate_series(min(start_timestamp)
, max(start_timestamp)
, interval '1 hour') AS ts
FROM header_table;
Typisk lidt hurtigere.
Opkald til sæt-retur-funktioner i SELECT
list er en ikke-standard-SQL-funktion og ildeset af nogle. Der var også adfærdsmæssige mærkeligheder (dog ikke for dette simple tilfælde), som til sidst blev rettet i Postgres 10. Se:
- Hvad er den forventede adfærd for flere sæt-returnerende funktioner i SELECT-sætning?
Bemærk en subtil forskel i NULL håndtering:
Det svarer til
max(start_timestamp)
opnås med
ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1
Uden NULLS LAST
NULL-værdier kommer først i faldende rækkefølge (hvis der kan). være NULL-værdier i start_timestamp
). Du ville få NULL for last_date
og din forespørgsel ville blive tom.
Detaljer:
- Hvorfor kommer NULL-værdier først, når du bestiller DESC i en PostgreSQL-forespørgsel?