PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Generate_series w Postgresie od daty rozpoczęcia i zakończenia w tabeli

Nie potrzebujesz do tego CTE, to byłoby droższe niż to konieczne.
I nie musisz przesyłać do timestamp , wynik już jest typu danych timestamp kiedy podajesz timestamp typy do generate_series() . Szczegóły tutaj:

  • Generowanie szeregów czasowych między dwiema datami w PostgreSQL

W Postgresie 9.3 lub później możesz użyć LATERAL dołącz:

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

Opcjonalnie z to_char() aby otrzymać wynik jako tekst we wspomnianym formacie.

Działa to w dowolnym Wersja Postgresa:

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

Zazwyczaj trochę szybciej.
Wywołanie funkcji zwracania zestawu w SELECT lista jest niestandardową funkcją SQL i przez niektórych nie podoba się to. Były też dziwactwa behawioralne (choć nie w tym prostym przypadku), które zostały ostatecznie naprawione w Postgres 10. Zobacz:

  • Jakie jest oczekiwane zachowanie wielu funkcji zwracających zestaw w klauzuli SELECT?

Uwaga subtelna różnica w NULL obsługa:

Odpowiednik

max(start_timestamp)

jest uzyskiwany z

ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1

Bez NULLS LAST Wartości NULL są najpierw w porządku malejącym (jeśli można być wartościami NULL w start_timestamp ). Otrzymasz NULL dla last_date Twoje zapytanie będzie puste.

Szczegóły:

  • Dlaczego wartości NULL są na pierwszym miejscu przy zamawianiu DESC w zapytaniu 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. Apache Spark:połączenie JDBC nie działa

  2. Zwróć dynamiczną tabelę z nieznanymi kolumnami z funkcji PL/pgSQL

  3. Napraw „BŁĄD:brak wpisu klauzuli FROM dla tabeli” w PostgreSQL podczas korzystania z UNION, EXCEPT lub INTERSECT

  4. String -> java.util.Date -> java.sql.Date (ze znacznikiem czasu)

  5. Jak wykonać duże, nieblokujące aktualizacje w PostgreSQL?