En una base de datos de transacciones que abarca miles de entidades durante 18 meses, me gustaría ejecutar una consulta para agrupar cada período de 30 días posible entity_id
con una SUMA de los montos de sus transacciones y COUNT de sus transacciones en ese período de 30 días, y devolver los datos de una manera que luego puedo consultar. Después de muchas pruebas, este código logra mucho de lo que quiero:
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;
Y usaré en una consulta más grande estructurada algo como:
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;
El caso que esta consulta no cubre es cuando los recuentos de transacciones abarcarían varios meses, pero aún se realizarían dentro de los 30 días de diferencia. ¿Es posible este tipo de consulta con Postgres? Si es así, agradezco cualquier aporte. Muchos de los otros temas discuten agregados "en ejecución ", no rodantes .
Actualizar
El CREATE TABLE
guión:
CREATE TABLE transactiondb (
id integer NOT NULL,
trans_ref_no character varying(255),
amount numeric(18,2),
trans_date date,
entity_id integer
);
Los datos de muestra se pueden encontrar aquí . Estoy ejecutando PostgreSQL 9.1.16.
La producción ideal incluiría SUM(amount)
y COUNT()
de todas las transacciones durante un período continuo de 30 días. Ver esta imagen, por ejemplo:
El resaltado de fecha verde indica lo que incluye mi consulta. El resaltado de la fila amarilla indica registros de lo que me gustaría formar parte del conjunto.
Lectura previa:
entity_id
en una ventana de 30 días a partir de cada transacción real. ¿Puede haber múltiples transacciones para el mismo (trans_date, entity_id)
o es esa combinación definida única? La definición de su tabla no tiene UNIQUE
restricciones o PK, pero parece que faltan restricciones ...
id
la clave primaria. Puede haber múltiples transacciones por entidad por día.
every possible 30-day period by entity_id
Quieres decir que el período puede comenzar cualquier día, entonces 365 períodos posibles en un año (no bisiesto)? ¿O solo desea considerar los días con una transacción real como inicio de un período individualmente para cualquieraentity_id
? De cualquier manera, proporcione la definición de la tabla, la versión de Postgres, algunos datos de muestra y el resultado esperado para la muestra.