PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Ambil agregat untuk interval waktu yang berubah-ubah

Untuk interval 15 menit, gunakan contoh Anda:

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

Bekerja selama 5 menit juga.

Lebih solusi umum untuk interval waktu reguler apa pun, dalam periode waktu apa pun:

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;

Jawaban terkait dengan penjelasan lebih lanjut:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hapus baris duplikat dari tabel kecil

  2. Tolok ukur Meltdown PostgreSQL

  3. Cadangkan PostgreSQL Menggunakan pg_dump dan pg_dumpall

  4. Postgresql - backup database dan restore pada pemilik yang berbeda?

  5. Cara menginstal PostgreSQL di macOS