K tomu nepotřebujete CTE, bylo by to dražší, než je nutné.
A nemusíte přenášet do timestamp
, výsledek již je datového typu timestamp
když zadáte timestamp
typy do generate_series()
. Podrobnosti zde:
- Generování časových řad mezi dvěma daty v PostgreSQL
V Postgres 9.3 nebo později můžete použít LATERAL
připojit se:
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);
Volitelně pomocí to_char()
získat výsledek jako text ve formátu, který jste uvedli.
Toto funguje v jakémkoli Verze Postgres:
SELECT generate_series(min(start_timestamp)
, max(start_timestamp)
, interval '1 hour') AS ts
FROM header_table;
Obvykle o něco rychlejší.
Volání funkcí pro vrácení sady v SELECT
seznam je nestandardní funkce SQL a někteří ji odsuzují. Také tam byly zvláštnosti chování (i když ne pro tento jednoduchý případ), které byly nakonec opraveny v Postgres 10. Viz:
- Jaké je očekávané chování pro více funkcí vracejících sadu v klauzuli SELECT?
Poznámka nepatrný rozdíl v NULL manipulace:
Ekvivalent
max(start_timestamp)
se získá pomocí
ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1
Bez NULLS LAST
Hodnoty NULL jsou nejprve v sestupném pořadí (pokud může být hodnoty NULL v start_timestamp
). Dostanete NULL pro last_date
a váš dotaz by byl prázdný.
Podrobnosti:
- Proč jsou hodnoty NULL na prvním místě při objednávání DESC v dotazu PostgreSQL?