sql >> Databasteknik >  >> RDS >> PostgreSQL

Generera_serier i Postgres från start- och slutdatum i en tabell

Du behöver ingen CTE för detta, det skulle bli dyrare än nödvändigt.
Och du behöver inte casta till timestamp , resultatet är redan av datatypen timestamp när du matar timestamp typer till generate_series() . Detaljer här:

  • Genererar tidsserier mellan två datum i PostgreSQL

I Postgres 9.3 eller senare kan du använda en LATERAL gå med:

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);

Valfritt med to_char() för att få resultatet som text i det format du nämnde.

Detta fungerar i alla Postgres version:

SELECT generate_series(min(start_timestamp)
                     , max(start_timestamp)
                     , interval '1 hour') AS ts
FROM   header_table;

Vanligtvis lite snabbare.
Anropar set-returnerande funktioner i SELECT list är en icke-standard-SQL-funktion och ogillas av vissa. Det fanns också beteendemässiga konstigheter (men inte för detta enkla fall) som så småningom fixades i Postgres 10. Se:

  • Vad är det förväntade beteendet för flera set-returfunktioner i SELECT-satsen?

Obs en subtil skillnad i NULL hantering:

Motsvarigheten till

max(start_timestamp)

erhålls med

ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1

Utan NULLS LAST NULL-värden kommer först i fallande ordning (om det kan). vara NULL-värden i start_timestamp ). Du skulle få NULL för last_date och din fråga skulle bli tom.

Detaljer:

  • Varför kommer NULL-värden först när man beställer DESC i en PostgreSQL-fråga?


  1. Uppgiftslista

  2. Hur man skapar VARRAYs som PL/SQL-blockmedlem i Oracle Database

  3. Hur man ändrar kolumn från Null till Not Null i SQL Server-tabellen - SQL Server / T-SQL självstudie del 52

  4. Oracle-leverantör för Oledb saknas i VS 2015 Shell