Nie potrzebujesz do tego CTE, to byłoby droższe niż to konieczne.
I nie musisz przesyłać do timestamp
, wynik już jest typu danych timestamp
kiedy podajesz timestamp
typy do generate_series()
. Szczegóły tutaj:
- Generowanie szeregów czasowych między dwiema datami w PostgreSQL
W Postgresie 9.3 lub później możesz użyć LATERAL
dołącz:
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);
Opcjonalnie z to_char()
aby otrzymać wynik jako tekst we wspomnianym formacie.
Działa to w dowolnym Wersja Postgresa:
SELECT generate_series(min(start_timestamp)
, max(start_timestamp)
, interval '1 hour') AS ts
FROM header_table;
Zazwyczaj trochę szybciej.
Wywołanie funkcji zwracania zestawu w SELECT
lista jest niestandardową funkcją SQL i przez niektórych nie podoba się to. Były też dziwactwa behawioralne (choć nie w tym prostym przypadku), które zostały ostatecznie naprawione w Postgres 10. Zobacz:
- Jakie jest oczekiwane zachowanie wielu funkcji zwracających zestaw w klauzuli SELECT?
Uwaga subtelna różnica w NULL obsługa:
Odpowiednik
max(start_timestamp)
jest uzyskiwany z
ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1
Bez NULLS LAST
Wartości NULL są najpierw w porządku malejącym (jeśli można być wartościami NULL w start_timestamp
). Otrzymasz NULL dla last_date
Twoje zapytanie będzie puste.
Szczegóły:
- Dlaczego wartości NULL są na pierwszym miejscu przy zamawianiu DESC w zapytaniu PostgreSQL?