In un database di transazioni che coprono migliaia di entità in 18 mesi, vorrei eseguire una query per raggruppare ogni possibile periodo di 30 giorni entity_id
con una SOMMA degli importi delle transazioni e COUNT delle loro transazioni in quel periodo di 30 giorni, e restituire i dati in modo che io possa quindi interrogare. Dopo molti test, questo codice realizza molto di ciò che voglio:
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;
E userò in una query più ampia strutturata qualcosa del tipo:
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;
Il caso in cui questa query non copre è quando il conteggio delle transazioni si estenderebbe per più mesi, ma comunque entro 30 giorni l'uno dall'altro. Questo tipo di query è possibile con Postgres? In tal caso, accolgo con favore qualsiasi input. Molti degli altri argomenti trattano aggregati "in esecuzione ", non a rotazione .
Aggiornare
La CREATE TABLE
sceneggiatura:
CREATE TABLE transactiondb (
id integer NOT NULL,
trans_ref_no character varying(255),
amount numeric(18,2),
trans_date date,
entity_id integer
);
I dati di esempio sono disponibili qui . Sto eseguendo PostgreSQL 9.1.16.
La produzione ideale dovrebbe includere SUM(amount)
e COUNT()
di tutte le transazioni su un periodo di 30 giorni continui. Vedi questa immagine, ad esempio:
L'evidenziazione della data verde indica ciò che viene incluso dalla mia query. L'evidenziazione della riga gialla indica che cosa vorrei far parte del set.
Lettura precedente:
entity_id
in una finestra di 30 giorni a partire da ogni transazione effettiva. Possono esserci più transazioni per la stessa (trans_date, entity_id)
o tale combinazione è definita unica? La definizione della tabella non ha alcun UNIQUE
vincolo o PK, ma i vincoli sembrano mancare ...
id
chiave primaria. Possono esserci più transazioni per entità al giorno.
every possible 30-day period by entity_id
si intende il periodo che può iniziare qualsiasi giorno, quindi 365 possibili periodi in un anno (non bisestile)? O vuoi considerare solo i giorni con una transazione effettiva come l'inizio di un periodo individualmente per qualcunoentity_id
? Ad ogni modo, si prega di fornire la definizione della tabella, la versione di Postgres, alcuni dati di esempio e il risultato previsto per il campione.