sql >> Database >  >> RDS >> PostgreSQL

Generate_series in Postgres vanaf begin- en einddatum in een tabel

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?


  1. Hoe het n-de woord extraheren en woordexemplaren tellen in een MySQL-tekenreeks?

  2. ORA-00904 ongeldige identifier op decodeer alias

  3. meerdere query's dezelfde tabel maar in verschillende kolommen mysql

  4. Opgeslagen MySQL-procedures maken en gebruiken - een zelfstudie