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

Hitungan baris yang bergulir dalam interval waktu

Suara seperti aplikasi untuk fungsi jendela . Tapi, sayangnya, tidak demikian. Bingkai jendela hanya dapat didasarkan pada jumlah baris, bukan pada nilai kolom yang sebenarnya.

Kueri sederhana dengan LEFT JOIN dapat melakukan pekerjaan:

SELECT t0.order_id
     , count(t1.time_created) AS count_within_3_sec
FROM   tbl      t0
LEFT   JOIN tbl t1 ON t1.time_created BETWEEN t0.time_created - interval '3 sec'
                                          AND t0.time_created
GROUP  BY 1
ORDER  BY 1;

db<>fiddle di sini

Tidak bekerja dengan time seperti di demo minimal Anda, karena itu tidak membungkus. Saya kira masuk akal untuk mengasumsikan timestamp atau timestamptz .

Karena Anda memasukkan setiap baris itu sendiri dalam hitungan, sebuah INNER JOIN akan bekerja juga. (LEFT JOIN masih lebih dapat diandalkan dalam menghadapi kemungkinan nilai NULL.)

Atau gunakan LATERAL subquery dan Anda tidak perlu menggabungkan pada tingkat kueri luar:

SELECT t0.order_id
     , t1.count_within_3_sec
FROM   tbl t0
LEFT   JOIN LATERAL (
   SELECT count(*) AS count_within_3_sec
   FROM   tbl t1
   WHERE  t1.time_created BETWEEN t0.time_created - interval '3 sec'
                              AND t0.time_created
   ) t1 ON true
ORDER  BY 1;

Terkait:

Untuk tabel besar dan banyak baris dalam kerangka waktu, solusi prosedural yang berjalan melalui tabel sekali akan berkinerja lebih baik. Seperti:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Membuat indeks case-insensitive pada array string Postgres

  2. Skema tabel yang memenuhi syarat dengan SQLAlchemy, SQLite, dan Postgresql?

  3. Kesalahan PostgreSQL:Fatal:nama pengguna peran tidak ada

  4. Buat fungsi SQL yang mengacu pada tabel atau kolom yang belum ada (belum)

  5. Bagaimana to_char() Bekerja di PostgreSQL