在一个涵盖18个月内成千上万个实体的交易的数据库中,我想运行一个查询,以将每个可能的30天期限entity_id
与该30天内的交易金额和COUNT 个交易的总和进行分组。以我可以查询的方式返回数据。经过大量测试,此代码完成了我想要的大部分工作:
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;
我将在更大的查询中使用类似以下内容的结构:
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;
该查询不涉及的情况是交易计数跨越多个月,但彼此之间的间隔仍在30天内。Postgres是否可以进行此类查询?如果是这样,我欢迎任何投入。其他许多主题都在讨论“ 运行 ”聚合,而不是滚动聚合。
更新资料
该CREATE TABLE
脚本:
CREATE TABLE transactiondb (
id integer NOT NULL,
trans_ref_no character varying(255),
amount numeric(18,2),
trans_date date,
entity_id integer
);
示例数据可以在这里找到。我正在运行PostgreSQL 9.1.16。
理想的输出将包括连续30天的所有交易中的SUM(amount)
和COUNT()
。参见此图像,例如:
绿色日期突出显示表示查询中包含的内容。黄色行突出显示表示我想成为集合的一部分的记录。
以前的阅读:
entity_id
的30天窗口中累积相同的行。可以有多个交易是相同的,还是该组合定义为唯一的?您的表定义没有或PK约束,但约束似乎丢失了(trans_date, entity_id)
UNIQUE
id
主键上。每个实体每天可能有多个交易。
every possible 30-day period by entity_id
你的意思期间可以开始任何一天,在(非闰年)年365期可能?或者,您是否只想将发生实际交易的天数视作任何一个期间的开始entity_id
?无论哪种方式,请提供表定义,Postgres版本,一些示例数据和示例的预期结果。