लघुगणक/शक्ति दृष्टिकोण आमतौर पर इस्तेमाल किया जाने वाला दृष्टिकोण है। Oracle के लिए, वह है:
select exp(sum(ln(col)))
from table;
मुझे नहीं पता कि मूल डेटाबेस डिज़ाइनरों ने PRODUCT()
. को शामिल क्यों नहीं किया एक एकत्रीकरण समारोह के रूप में। मेरा सबसे अच्छा अनुमान यह है कि वे सभी कंप्यूटर वैज्ञानिक थे, जिनमें कोई सांख्यिकीविद नहीं था। इस तरह के कार्य आंकड़ों में बहुत उपयोगी होते हैं, लेकिन वे कंप्यूटर विज्ञान में ज्यादा दिखाई नहीं देते हैं। शायद वे अतिप्रवाह के मुद्दों से निपटना नहीं चाहते थे, कि इस तरह के एक समारोह का अर्थ होगा (विशेषकर पूर्णांकों पर)।
वैसे, यह फ़ंक्शन अधिकांश डेटाबेस से गायब है, यहां तक कि वे भी जो बहुत सारे सांख्यिकीय एकत्रीकरण कार्यों को लागू करते हैं।
संपादित करें:
ओह, ऋणात्मक संख्याओं की समस्या इसे थोड़ा और जटिल बनाती है:
select ((case when mod(sum(sign(col)), 2) = 0 then 1 else -1 end) *
exp(sum(ln(abs(col))))
) as product
मैं Oracle में 0
. को संभालने के सुरक्षित तरीके के बारे में सुनिश्चित नहीं हूं एस। यह एक "तार्किक" दृष्टिकोण है:
select (case when sum(case when col = 0 then 1 else 0 end) > 0
then NULL
when mod(sum(sign(col)), 2) = 0
then exp(sum(ln(abs(col)))
else - exp(sum(ln(abs(col)))
end)
) as product
समस्या यह है कि डेटाबेस इंजन case
. को निष्पादित करने से पहले लॉग पर त्रुटि प्राप्त कर सकता है बयान। ऐसा होता है कि SQL सर्वर कैसे काम करता है। मैं Oracle के बारे में निश्चित नहीं हूं।
आह, यह काम कर सकता है:
select (case when sum(case when col = 0 then 1 else 0 end) > 0
then NULL
when mod(sum(sign(col)), 2) = 0
then exp(sum(ln(case when col <> 0 then abs(col) end)))
else - exp(sum(ln(case when col <> 0 then abs(col) end)))
end)
) as product
यह NULL
returns लौटाता है जब कोई 0
हो ।