PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Generate_series в Postgres от начална и крайна дата в таблица

Не се нуждаете от CTE за това, това би било по-скъпо от необходимото.
И не е необходимо да прехвърляте към timestamp , резултатът вече е от тип данни timestamp когато подавате timestamp типове за generate_series() . Подробности тук:

  • Генериране на времеви серии между две дати в PostgreSQL

В Postgres 9.3 или по-късно можете да използвате LATERAL присъединете се:

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

По избор с to_char() за да получите резултата като текст в споменатия от вас формат.

Това работи ввсички Версия на Postgres:

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

Обикновено малко по-бързо.
Извикване на функции за връщане на набор в SELECT списъкът е нестандартна-SQL функция и някои не го уважават. Освен това имаше поведенчески странности (макар и не за този прост случай), които в крайна сметка бяха коригирани в Postgres 10. Вижте:

  • Какво е очакваното поведение за множество връщащи набор функции в клауза SELECT?

Забележка фина разлика в NULL работа:

Еквивалентът на

max(start_timestamp)

се получава с

ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1

Без NULLS LAST NULL стойностите идват първи в низходящ ред (ако може да бъдат NULL стойности в start_timestamp ). Ще получите NULL за last_date и вашата заявка ще се окаже празна.

Подробности:

  • Защо NULL стойностите са на първо място при поръчка на DESC в PostgreSQL заявка?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв е максималният брой колони в заявка за избор на PostgreSQL

  2. Дефинирано ограничение ОТЛОЖЕНО ПЪРВОНАЧАЛНО НЕЗАБАВНО все още е ОТЛОЖЕНО?

  3. NodeJS Postgres грешка getaddrinfo ENOTFOUND

  4. Планове за колонни магазини

  5. hasMany извика с нещо, което не е екземпляр на Sequelize.Model