Не се нуждаете от CTE за това, това би било по-скъпо от необходимото.
И не е необходимо да прехвърляте към timestamp
, резултатът вече е от тип данни timestamp
когато подавате timestamp
типове за generate_series()
. Подробности тук:
- Генериране на времеви серии между две дати в PostgreSQL
В 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
списъкът е нестандартна-SQL функция и някои не го уважават. Освен това имаше поведенчески странности (макар и не за този прост случай), които в крайна сметка бяха коригирани в Postgres 10. Вижте:
- Какво е очакваното поведение за множество връщащи набор функции в клауза SELECT?
Забележка фина разлика в NULL работа:
Еквивалентът на
max(start_timestamp)
се получава с
ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1
Без NULLS LAST
NULL стойностите идват първи в низходящ ред (ако може да бъдат NULL стойности в start_timestamp
). Ще получите NULL за last_date
и вашата заявка ще се окаже празна.
Подробности:
- Защо NULL стойностите са на първо място при поръчка на DESC в PostgreSQL заявка?