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

Pobieraj agregaty dla dowolnych przedziałów czasu

Dla 15-minutowych interwałów, budując na swoim przykładzie:

SELECT DISTINCT
     , date_trunc('hour', t) AS h
     , floor(EXTRACT(minute FROM t) / 15) AS m15
     , min(price) OVER w
     , max(price) OVER w
     , first_value(price) OVER w
     , last_value(price) OVER w
FROM   ticker
WINDOW w AS (PARTITION BY date_trunc('hour', t)
                        , floor(extract(minute FROM t) / 15));

Działa również przez 5 minut.

Bardziej ogólne rozwiązanie w dowolnych regularnych odstępach czasu, w dowolnym okresie czasu:

WITH x AS (
    SELECT t1, t1 + interval '5min' AS t2
    FROM   generate_series(timestamp '2012-07-18 00:00'
                         , timestamp '2012-07-18 23:55'
                         , interval '5 min') AS t1
    )
SELECT DISTINCT ON (1)
       x.t1
     , min(price)         OVER w
     , max(price)         OVER w
     , first_value(price) OVER w
     , last_value(price)  OVER w
FROM   x
JOIN   ticker y ON y.t >= x.t1  -- use LEFT JOIN to include empty intervals
               AND y.t <  x.t2  -- don't use BETWEEN
WINDOW w AS (PARTITION BY x.t1)
ORDER  BY x.t1;

Powiązane odpowiedzi z dodatkowym wyjaśnieniem:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Różnica między językiem sql a językiem plpgsql w funkcjach PostgreSQL

  2. Czy Sqlalchemy może dobrze współpracować z wieloma dołączonymi plikami bazy danych SQLite?

  3. Nie można utworzyć nowej tabeli po publicznym DROP SCHEMA

  4. Jak wygenerować schemat z pliku CSV dla kopii PostgreSQL?

  5. Jak pobrać poszczególne kolumny z tabeli zwróconej z funkcji?