मेरे पास एक तालिका है जिसमें दशमलव मानों का एक कॉलम शामिल है, जैसे कि:
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
, आदि। यहां एक उदाहरण है कि मैंने 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 की वॉल्यूम क्षमता वाली बाल्टियों की एक श्रृंखला है, और मुझे यह निर्धारित करने की आवश्यकता है कि इनमें से कितनी बाल्टियों की मुझे आवश्यकता होगी और कौन सी बकेट प्रत्येक आइटम के मूल्य के अनुसार जाती है, उच्चतम से सबसे कम क्रमबद्ध।
एक भौतिक वस्तु एक साथ दो स्थानों पर मौजूद नहीं हो सकती है, इसलिए इसे एक बाल्टी या दूसरे में होना चाहिए। यही कारण है कि मैं एक रनिंग टोटल + CEILING
सॉल्यूशन नहीं कर सकता , क्योंकि इससे रिकॉर्ड दो बाल्टी में अपने आकार में योगदान कर सकते हैं।
distinct_count
चीजों को जटिल करने पर बाल्टी लगाने की आवश्यकता । इस तरह की खिड़की के काम के लिए एरॉन बर्ट्रेंड के पास SQL सर्वर पर आपके विकल्पों का एक बड़ा सारांश है । मैंने गणना करने के लिए "quirky अपडेट" विधि का उपयोग किया है distinct_sum
, जिसे आप SQL फिडल पर यहां देख सकते हैं , लेकिन यह अविश्वसनीय है।