18 개월 동안 1,000 개의 엔터티에 걸친 트랜잭션 데이터베이스에서 가능한 30 일마다 entity_id
트랜잭션 금액의 합과 30 일 동안의 트랜잭션 수를 합하여 쿼리를 실행하고 싶습니다. 내가 쿼리 할 수있는 방식으로 데이터를 반환하십시오. 많은 테스트를 거친 후이 코드는 내가 원하는 많은 것을 달성합니다.
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을 실행 중입니다.
이상적인 출력이 포함됩니다 SUM(amount)
및 COUNT()
롤링 30 일 기간 동안 모든 거래의. 예를 들어이 이미지를 참조하십시오.
녹색 날짜 강조 표시는 내 쿼리에 포함 된 내용을 나타냅니다. 노란색 행 강조 표시는 세트의 일부가되고 싶은 것을 기록합니다.
이전 독서 :
entity_id
하여 30 일 동안 동일한 행을 누적하려고 합니다. 동일한 거래가 여러 개있을 수 있습니까? 아니면 그 조합이 고유 한 것으로 정의되어 있습니까? 테이블 정의에 PK 제약 조건이 없거나 제약 조건이 있지만 제약 조건이 누락 된 것 같습니다.(trans_date, entity_id)
UNIQUE
id
기본 키에 있습니다. 엔터티 당 하루에 여러 트랜잭션이있을 수 있습니다.
every possible 30-day period by entity_id
당신의 기간이 시작 의미 있는 , 하루 (비 도약) 년에 지금 365 개 가능한 기간을? 아니면 실제 거래가있는 날만 개별적으로 기간의 시작으로 간주하고 싶entity_id
습니까? 어느 쪽이든, 테이블 정의, Postgres 버전, 일부 샘플 데이터 및 샘플에 대한 예상 결과를 제공하십시오.