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

Postgresql SQL GROUP BY interval waktu dengan akurasi sewenang-wenang (hingga mili detik)

Anda dapat membuat tabel "bucket" dengan menambahkan interval yang dibuat oleh generate_series(). Pernyataan SQL ini akan menghasilkan tabel ember lima menit untuk hari pertama (nilai min(measured_at) ) di data Anda.

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

Bungkus itu pernyataan dalam ekspresi tabel umum, dan Anda dapat bergabung dan mengelompokkannya seolah-olah itu adalah tabel dasar.

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

Pengelompokan menurut jumlah detik yang berubah-ubah serupa--gunakan date_trunc() .

Penggunaan generate_series() yang lebih umum memungkinkan Anda menghindari menebak batas atas untuk ember lima menit. Dalam praktiknya, Anda mungkin akan membangun ini sebagai tampilan atau fungsi. Anda mungkin mendapatkan kinerja yang lebih baik dari tabel dasar.

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. konversi tipe data MySQL SET ke Postgres

  2. Kembali ke readline versi 6.x di Homebrew untuk memperbaiki Postgresql?

  3. PostgreSQL adalah database terbaik dunia

  4. Postgresql :Koneksi ditolak. Periksa apakah nama host dan port sudah benar dan postmaster menerima koneksi TCP/IP

  5. perbarui kueri dengan bergabung di dua tabel