আমার একটি টেবিল রয়েছে যার মধ্যে দশমিক মানগুলির কলাম রয়েছে:
id value size
-- ----- ----
1 100 .02
2 99 .38
3 98 .13
4 97 .35
5 96 .15
6 95 .57
7 94 .25
8 93 .15
আমার যা অর্জন করতে হবে তা বর্ণনা করা কিছুটা কঠিন, তাই দয়া করে আমাকে সহ্য করুন। আমি যা করার চেষ্টা করছি তা হ'ল size
কলামটির একটি সামগ্রিক মান তৈরি করা যা পূর্ববর্তী সারিগুলি 1 অনুসারে 1 অনুযায়ী বৃদ্ধি পায়, যখন অনুসারে ক্রমবর্ধমান ক্রম অনুসারে value
। ফলাফলটি এরকম কিছু দেখাচ্ছে:
id value size bucket
-- ----- ---- ------
1 100 .02 1
2 99 .38 1
3 98 .13 1
4 97 .35 1
5 96 .15 2
6 95 .57 2
7 94 .25 2
8 93 .15 3
আমার নিষ্পাপ প্রথম চেষ্টাটি ছিল একটি দৌড় SUM
এবং তারপরে CEILING
এই মানটি রাখা, তবে এটি এমন কোনও মামলা পরিচালনা করে না যেখানে কয়েকটি রেকর্ডের size
দুটি পৃথক বালতিতে মোট অবদান অবদান রয়েছে। নীচের উদাহরণ এটি স্পষ্ট করতে পারে:
id value size crude_sum crude_bucket distinct_sum bucket
-- ----- ---- --------- ------------ ------------ ------
1 100 .02 .02 1 .02 1
2 99 .38 .40 1 .40 1
3 98 .13 .53 1 .53 1
4 97 .35 .88 1 .88 1
5 96 .15 1.03 2 .15 2
6 95 .57 1.60 2 .72 2
7 94 .25 1.85 2 .97 2
8 93 .15 2.00 2 .15 3
যেহেতু আপনি দেখতে পারেন, আমি যদি কেবল ব্যবহার ছিল CEILING
উপর crude_sum
রেকর্ড # 8 বালতি 2. নির্ধারিত হবে এই দ্বারা ঘটিত হয় size
দুই বালতি জুড়ে রেকর্ডের # 5 এবং # 8 বিভক্ত হচ্ছে। পরিবর্তে, আদর্শ সমাধান হ'ল প্রতিবার সমষ্টিটি 1 এ পৌঁছানোর পরে পুনরায় সেট করা, যা bucket
কলামটি বাড়িয়ে তোলে এবং বর্তমান রেকর্ডের মান SUM
থেকে শুরু করে একটি নতুন ক্রিয়াকলাপ শুরু করে size
। যেহেতু রেকর্ডগুলির ক্রম এই ক্রিয়াকলাপের জন্য গুরুত্বপূর্ণ, আমি value
কলামটি অন্তর্ভুক্ত করেছি , যা উতরাই ক্রমে সাজানোর উদ্দেশ্যে।
আমার প্রাথমিক প্রচেষ্টায় ডেটা একাধিক পাস করা, একবার SUM
অপারেশন সম্পাদন করা , আরও একবার CEILING
ইত্যাদি জড়িত ছিল etc. এখানে crude_sum
কলামটি তৈরি করতে আমি কী করেছি তার উদাহরণ এখানে :
SELECT
id,
value,
size,
(SELECT TOP 1 SUM(size) FROM table t2 WHERE t2.value<=t1.value) as crude_sum
FROM
table t1
যা UPDATE
পরবর্তী সময়ে কাজ করার জন্য একটি টেবিলের মধ্যে মান সন্নিবেশ করানোর জন্য একটি অপারেশনে ব্যবহৃত হয়েছিল ।
সম্পাদনা করুন: আমি এটি ব্যাখ্যা করতে গিয়ে অন্য ছুরিকাঘাত নিতে চাই, তাই এখানে চলে যায়। প্রতিটি রেকর্ড একটি শারীরিক আইটেম কল্পনা করুন। এই আইটেমটির সাথে এর সাথে সম্পর্কিত একটি মান রয়েছে এবং একটির চেয়ে একটি দৈহিক আকার। আমার ভলিউম ক্ষমতা হুবহু 1 এর একটি বালতি রয়েছে এবং আমার নির্ধারণ করা দরকার যে এই কতগুলি বালতি আমার প্রয়োজন এবং প্রতিটি আইটেমটি আইটেমের মান অনুসারে যায়, সর্বোচ্চ থেকে নীচে যায় orted
একটি দৈহিক আইটেম একবারে দুটি স্থানে থাকতে পারে না, তাই এটি অবশ্যই একটি বালতিতে বা অন্যটিতে থাকতে হবে। এই কারণেই আমি মোট চলমান + CEILING
সমাধান করতে পারি না , কারণ এটি রেকর্ডগুলি তাদের আকার দুটি বালতিতে অবদান রাখতে দেয়।
distinct_count
জিনিসগুলিতে বুকিংয়ের প্রয়োজনীয়তা বিষয়গুলিকে জটিল করে তোলে । এই জাতীয় উইন্ডোটিংয়ের কাজের জন্য অ্যারন বারট্র্যান্ডের এসকিউএল সার্ভারে আপনার বিকল্পগুলির দুর্দান্ত সংক্ষিপ্তসার রয়েছে । গণনা করার জন্য আমি "কুইকি আপডেট" পদ্ধতিটি ব্যবহার করেছি distinct_sum
, যা আপনি এসকিউএল ফিডেলে এখানে দেখতে পাচ্ছেন , তবে এটি বিশ্বাসযোগ্য নয়।