Trong cơ sở dữ liệu về các giao dịch kéo dài 1.000 thực thể trong vòng 18 tháng, tôi muốn chạy truy vấn để nhóm mỗi khoảng thời gian 30 ngày có thể bằng entity_id
SUM với số tiền giao dịch của họ và COUNT giao dịch của họ trong khoảng thời gian 30 ngày đó và trả về dữ liệu theo cách mà sau đó tôi có thể truy vấn. Sau rất nhiều thử nghiệm, mã này hoàn thành phần lớn những gì tôi muốn:
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;
Và tôi sẽ sử dụng trong một truy vấn lớn hơn có cấu trúc như:
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;
Trường hợp truy vấn này không bao gồm là khi số lượng giao dịch sẽ kéo dài nhiều tháng, nhưng vẫn trong vòng 30 ngày của nhau. Là loại truy vấn có thể với Postgres? Nếu vậy, tôi hoan nghênh bất kỳ đầu vào. Nhiều chủ đề khác thảo luận về tập hợp " chạy ", không lăn .
Cập nhật
Các CREATE TABLE
kịch bản:
CREATE TABLE transactiondb (
id integer NOT NULL,
trans_ref_no character varying(255),
amount numeric(18,2),
trans_date date,
entity_id integer
);
Dữ liệu mẫu có thể được tìm thấy ở đây . Tôi đang chạy PostgreSQL 9.1.16.
Sản lượng lý tưởng sẽ bao gồm SUM(amount)
và COUNT()
tất cả các giao dịch trong khoảng thời gian 30 ngày. Xem hình ảnh này, ví dụ:
Đánh dấu ngày màu xanh lá cây cho biết những gì được bao gồm bởi truy vấn của tôi. Tô sáng hàng màu vàng cho biết bản ghi những gì tôi muốn trở thành một phần của tập hợp.
Đọc trước:
entity_id
trong cửa sổ 30 ngày bắt đầu từ mỗi giao dịch thực tế. Có thể có nhiều giao dịch cho cùng một (trans_date, entity_id)
hoặc là sự kết hợp được xác định duy nhất? Định nghĩa bảng của bạn không có UNIQUE
hoặc ràng buộc PK, nhưng dường như thiếu các ràng buộc ...
id
khóa chính. Có thể có nhiều giao dịch cho mỗi thực thể mỗi ngày.
every possible 30-day period by entity_id
bạn là khoảng thời gian có thể bắt đầu bất kỳ ngày nào , vậy 365 giai đoạn có thể trong một năm (không nhảy)? Hay bạn chỉ muốn coi ngày với một giao dịch thực tế là bắt đầu một khoảng thời gian riêng lẻ cho bất kỳentity_id
? Dù bằng cách nào, vui lòng cung cấp định nghĩa bảng của bạn, phiên bản Postgres, một số dữ liệu mẫu và kết quả mong đợi cho mẫu.