18 aydan uzun bir süredir 1.000 kişiyi kapsayan bir işlem veritabanında, 30 günlük dönemde entity_id
işlem tutarlarının toplamı ve işlemlerinin COUNT değeri ile her 30 günlük dönemde bir grup oluşturmak için bir sorgu çalıştırmak ve Verileri daha sonra sorgulayabileceğim şekilde döndürür. Bir sürü testten sonra, bu kod istediğimin çoğunu başarıyor:
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;
Ve ben gibi bir şey yapılandırılmış daha büyük bir sorguda kullanacağım:
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;
Bu sorgunun kapsamadığı durum, işlem sayılarının birkaç ay içerdiği, ancak yine de birbirinin 30 gün içinde olacağı durumudur. Postgres ile bu tür bir sorgu mümkün mü? Eğer öyleyse, herhangi bir girişi hoş geldiniz. Diğer konuların birçoğu " çalışan " toplamaları tartışıyor , yuvarlamıyor .
Güncelleştirme
CREATE TABLE
komut:
CREATE TABLE transactiondb (
id integer NOT NULL,
trans_ref_no character varying(255),
amount numeric(18,2),
trans_date date,
entity_id integer
);
Örnek veriler burada bulunabilir . PostgreSQL 9.1.16 kullanıyorum.
İdeal çıkış yer alacağını SUM(amount)
ve COUNT()
yuvarlanan 30 günlük süre içinde tüm işlemlerin. Bu resme bakın, örneğin:
Yeşil tarih vurgulaması, sorguma nelerin dahil edildiğini gösterir. Sarı satır vurgulaması, setin bir parçası olmak istediğim kayıtları gösterir.
Önceki okuma:
entity_id
30 günlük bir pencerede aynı satırları biriktirmek istersiniz . Aynı işlem için birden fazla işlem olabilir mi veya bu kombinasyon benzersiz mi tanımlanmış? Tablo tanımınızın PK kısıtlaması yok veya kısıtlaması var, ancak kısıtlamalar eksik görünüyor ...(trans_date, entity_id)
UNIQUE
id
birincil anahtardadır. Varlık başına günlük birden çok işlem olabilir.
every possible 30-day period by entity_id
size dönemi başlayabilir anlamına herhangi , bir gün bir (eksik olmayan) yıl içinde bu kadar 365 olası dönemlerini? Veya gerçek bir işlemin olduğu günleri yalnızca herhangi bir dönem için tek başına bir dönem olarak mı değerlendirmek istiyorsunuzentity_id
? Her iki durumda da, lütfen tablo tanımınızı, Postgres sürümünüzü, bazı örnek verileri ve örnek için beklenen sonucu sağlayın.