18 মাসেরও বেশি সময় ধরে 1000,000 সত্তা লেনদেনের একটি ডাটাবেসে, আমি 30 দিনের মেয়াদে entity_id
তাদের লেনদেনের পরিমাণের একটি এসএমএম এবং সেই 30 দিনের সময়কালে তাদের লেনদেনের COUNT দ্বারা প্রতিটি সম্ভাব্য 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 দিনের মধ্যে থাকে। পোস্টগ্রিসের সাথে কি এই জাতীয় কোয়েরি সম্ভব? যদি তা হয় তবে আমি কোনও ইনপুটকে স্বাগত জানাই। অন্যান্য বিষয়গুলির মধ্যে অনেকগুলি " চলমান " সমষ্টি সম্পর্কে আলোচনা করে, ঘূর্ণায়মান নয় ।
হালনাগাদ
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
);
নমুনা তথ্য এখানে পাওয়া যাবে । আমি পোস্টগ্রিসকিউএল 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
? যে কোনও উপায়ে, দয়া করে আপনার টেবিল সংজ্ঞা, পোস্টগ্রিস সংস্করণ, কিছু নমুনার ডেটা এবং নমুনার প্রত্যাশিত ফলাফল সরবরাহ করুন।