Dalam basis data transaksi yang mencakup 1.000 entitas selama 18 bulan, saya ingin menjalankan kueri untuk mengelompokkan setiap periode 30 hari yang mungkin entity_id
dengan SUM dari jumlah transaksi mereka dan COUNT transaksi mereka dalam periode 30 hari itu, dan kembalikan data dengan cara yang kemudian bisa saya tanyakan. Setelah banyak pengujian, kode ini mencapai banyak hal yang saya inginkan:
SELECT id, trans_ref_no, amount, trans_date, entity_id,
SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total,
COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count
FROM transactiondb;
Dan saya akan menggunakan kueri terstruktur yang lebih besar seperti:
SELECT * FROM (
SELECT id, trans_ref_no, amount, trans_date, entity_id,
SUM(amount) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_total,
COUNT(id) OVER(PARTITION BY entity_id, date_trunc('month',trans_date) ORDER BY entity_id, trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS trans_count
FROM transactiondb ) q
WHERE trans_count >= 4
AND trans_total >= 50000;
Kasus yang tidak dicakup oleh kueri ini adalah saat jumlah transaksi akan berlangsung beberapa bulan, namun masih dalam 30 hari satu sama lain. Apakah jenis permintaan ini memungkinkan dengan Postgres? Jika demikian, saya menerima masukan apa pun. Banyak topik lain membahas agregat " berjalan ", bukan bergulir .
Memperbarui
The CREATE TABLE
Script:
CREATE TABLE transactiondb (
id integer NOT NULL,
trans_ref_no character varying(255),
amount numeric(18,2),
trans_date date,
entity_id integer
);
Sampel data dapat ditemukan di sini . Saya menjalankan PostgreSQL 9.1.16.
Output ideal akan mencakup SUM(amount)
dan COUNT()
dari semua transaksi selama periode 30 hari bergulir. Lihat gambar ini, misalnya:
Sorotan tanggal hijau menunjukkan apa yang disertakan oleh kueri saya. Sorotan baris kuning menunjukkan catatan apa yang saya ingin menjadi bagian dari set.
Bacaan sebelumnya:
entity_id
dalam 30 hari mulai dari setiap transaksi aktual. Mungkinkah ada beberapa transaksi untuk hal yang sama (trans_date, entity_id)
atau kombinasi itu unik? Definisi tabel Anda tidak memiliki UNIQUE
kendala PK atau apa pun, tetapi kendala tampaknya tidak ada ...
id
kunci utama. Mungkin ada beberapa transaksi per entitas per hari.
every possible 30-day period by entity_id
Anda berarti periode dapat memulai setiap hari, sehingga 365 periode mungkin dalam (non-lompatan) tahun? Atau apakah Anda hanya ingin mempertimbangkan hari-hari dengan transaksi aktual sebagai permulaan periode secara individualentity_id
? Either way, tolong berikan definisi tabel Anda, versi Postgres, beberapa data sampel dan hasil yang diharapkan untuk sampel.