Je hebt hiervoor geen CTE nodig, dat zou duurder zijn dan nodig.
En je hoeft niet te casten naar timestamp
, het resultaat is al is van gegevenstype timestamp
wanneer u timestamp
voedt typen naar generate_series()
. Details hier:
- Tijdreeksen genereren tussen twee datums in PostgreSQL
In Postgres 9.3 of later kunt u een LATERAL
. gebruiken doe mee:
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);
Optioneel met to_char()
om het resultaat als tekst te krijgen in het formaat dat u noemde.
Dit werkt in elke Postgres-versie:
SELECT generate_series(min(start_timestamp)
, max(start_timestamp)
, interval '1 hour') AS ts
FROM header_table;
Typisch een beetje sneller.
Set-returning-functies aanroepen in de SELECT
list is een niet-standaard SQL-functie en wordt door sommigen afgekeurd. Er waren ook gedragsafwijkingen (hoewel niet voor dit eenvoudige geval) die uiteindelijk werden opgelost in Postgres 10. Zie:
- Wat is het verwachte gedrag voor functies die meerdere sets retourneren in de SELECT-component?
Opmerking een subtiel verschil in NULL behandeling:
Het equivalent van
max(start_timestamp)
wordt verkregen met
ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1
Zonder NULLS LAST
NULL-waarden komen eerst in aflopende volgorde (als er kan wees NULL-waarden in start_timestamp
). Je zou NULL krijgen voor last_date
en uw zoekopdracht zou leeg zijn.
Details:
- Waarom komen NULL-waarden eerst bij het bestellen van DESC in een PostgreSQL-query?