sql >> Databáze >  >> RDS >> PostgreSQL

Generujte_série v Postgresu od počátečního a koncového data v tabulce

K tomu nepotřebujete CTE, bylo by to dražší, než je nutné.
A nemusíte přenášet do timestamp , výsledek již je datového typu timestamp když zadáte timestamp typy do generate_series() . Podrobnosti zde:

  • Generování časových řad mezi dvěma daty v PostgreSQL

V Postgres 9.3 nebo později můžete použít LATERAL připojit se:

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

Volitelně pomocí to_char() získat výsledek jako text ve formátu, který jste uvedli.

Toto funguje v jakémkoli Verze Postgres:

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

Obvykle o něco rychlejší.
Volání funkcí pro vrácení sady v SELECT seznam je nestandardní funkce SQL a někteří ji odsuzují. Také tam byly zvláštnosti chování (i když ne pro tento jednoduchý případ), které byly nakonec opraveny v Postgres 10. Viz:

  • Jaké je očekávané chování pro více funkcí vracejících sadu v klauzuli SELECT?

Poznámka nepatrný rozdíl v NULL manipulace:

Ekvivalent

max(start_timestamp)

se získá pomocí

ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1

Bez NULLS LAST Hodnoty NULL jsou nejprve v sestupném pořadí (pokud může být hodnoty NULL v start_timestamp ). Dostanete NULL pro last_date a váš dotaz by byl prázdný.

Podrobnosti:

  • Proč jsou hodnoty NULL na prvním místě při objednávání DESC v dotazu PostgreSQL?


  1. Má PL/SQL ekvivalentní StringTokenizer jako Java?

  2. Získejte poslední vložené ID řádku (s příkazem SQL)

  3. Jak obnovit jednu tabulku MySQL pomocí mysqldump?

  4. PostgreSQL:zlepšení výkonu pg_dump, pg_restore