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

Postgresql SQL GROUP BY interwał czasowy z dowolną dokładnością (do milisekund)

Możesz wygenerować tabelę „wiader”, dodając interwały utworzone przez generate_series(). Ta instrukcja SQL wygeneruje tabelę pięciominutowych przedziałów dla pierwszego dnia (wartość min(measured_at) ) w Twoich danych.

select 
  (select min(measured_at)::date from measurements) + ( n    || ' minutes')::interval start_time,
  (select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0, (24*60), 5) n

Zawiń to we wspólnym wyrażeniu tabelowym i możesz do niego dołączać i grupować go tak, jakby była to tabela podstawowa.

with five_min_intervals as (
  select 
    (select min(measured_at)::date from measurements) + ( n    || ' minutes')::interval start_time,
    (select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
  from generate_series(0, (24*60), 5) n
)
select f.start_time, f.end_time, avg(m.val) avg_val 
from measurements m
right join five_min_intervals f 
        on m.measured_at >= f.start_time and m.measured_at < f.end_time
group by f.start_time, f.end_time
order by f.start_time

Grupowanie według dowolnej liczby sekund jest podobne — użyj date_trunc() .

Bardziej ogólne użycie metody generate_series() pozwala uniknąć zgadywania górnego limitu dla przedziałów pięciominutowych. W praktyce prawdopodobnie zbudowałbyś to jako widok lub funkcję. Możesz uzyskać lepszą wydajność z tabeli podstawowej.

select 
  (select min(measured_at)::date from measurements) + ( n    || ' minutes')::interval start_time,
  (select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0, ((select max(measured_at)::date - min(measured_at)::date from measurements) + 1)*24*60, 5) n;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Transakcja autonomiczna w PostgreSQL 9.1

  2. Czy PostgreSQL obsługuje przezroczystą kompresję tabel (fragmentów)?

  3. Użyj \copy psql dla zapytania wielowierszowego

  4. PSQLException:bieżąca transakcja jest przerwana, polecenia ignorowane do końca bloku transakcji

  5. PG::InvalidParameterValue:ERROR:nieprawidłowa wartość parametru client_min_messages:panika