sql >> Database teknologi >  >> RDS >> PostgreSQL

Generer_serier i Postgres fra start- og slutdato i en tabel

Du behøver ikke en CTE til dette, det ville være dyrere end nødvendigt.
Og du behøver ikke at caste til timestamp , resultatet er allerede af datatypen timestamp når du fodrer timestamp typer til generate_series() . Detaljer her:

  • Generering af tidsserier mellem to datoer i PostgreSQL

I Postgres 9.3 eller senere kan du bruge en LATERAL deltage:

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

Eventuelt med to_char() for at få resultatet som tekst i det format, du nævnte.

Dette virker i alle Postgres version:

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

Typisk lidt hurtigere.
Opkald til sæt-retur-funktioner i SELECT list er en ikke-standard-SQL-funktion og ildeset af nogle. Der var også adfærdsmæssige mærkeligheder (dog ikke for dette simple tilfælde), som til sidst blev rettet i Postgres 10. Se:

  • Hvad er den forventede adfærd for flere sæt-returnerende funktioner i SELECT-sætning?

Bemærk en subtil forskel i NULL håndtering:

Det svarer til

max(start_timestamp)

opnås med

ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1

Uden NULLS LAST NULL-værdier kommer først i faldende rækkefølge (hvis der kan). være NULL-værdier i start_timestamp ). Du ville få NULL for last_date og din forespørgsel ville blive tom.

Detaljer:

  • Hvorfor kommer NULL-værdier først, når du bestiller DESC i en PostgreSQL-forespørgsel?


  1. Gns. af float-inkonsekvens

  2. Du skal installere postgresql-server-dev-X.Y for at bygge en server-side-udvidelse eller libpq-dev for at bygge en klient-side-applikation

  3. Sådan får du adgang til og opdaterer Sqlite db-fil gemt lokalt [aktivmappe] i projektfil ved hjælp af cordova

  4. Hvorfor bruge INCLUDE-sætningen, når du opretter et indeks?