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:
- Fungsi Jendela atau Ekspresi Tabel Umum:hitung baris sebelumnya dalam rentang
- Alternatif untuk PL/ruby yang rusak:konversi tabel jurnal gudang
- GROUP BY dan agregat nilai numerik berurutan