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-दिवसीय विंडो में उसी की पंक्तियों को जमा करना चाहते हैं । क्या एक ही के लिए कई लेनदेन हो सकते हैं या क्या संयोजन अद्वितीय है? आपकी तालिका की परिभाषा में कोई या पीके बाधा नहीं है, लेकिन अड़चनें गायब लगती हैं ...(trans_date, entity_id)
UNIQUE
id
प्राथमिक कुंजी पर है। प्रति दिन प्रति इकाई कई लेनदेन हो सकते हैं।
every possible 30-day period by entity_id
तुम्हारा मतलब अवधि शुरू कर सकते हैं किसी भी दिन एक (गैर छलांग) वर्ष में तो 365 संभव अवधि,? या क्या आप केवल वास्तविक लेनदेन के साथ दिनों पर विचार करना चाहते हैं क्योंकि किसी भी अवधि के लिए व्यक्तिगत रूप से शुरू करनाentity_id
? किसी भी तरह, कृपया अपनी तालिका परिभाषा, पोस्टग्रेज संस्करण, कुछ नमूना डेटा और नमूना के लिए अपेक्षित परिणाम प्रदान करें।