MUL से आपका मतलब मूल्यों का प्रगतिशील गुणन है?
यहां तक कि कुछ छोटे आकार (10s कहें) की 100 पंक्तियों के साथ, आपका एमयूएल (कॉलम) किसी भी डेटा प्रकार को ओवरफ्लो करने जा रहा है! गलत/अब-उपयोग की इतनी अधिक संभावना और उपयोग के लिए बहुत सीमित दायरे के साथ, इसे SQL मानक होने की आवश्यकता नहीं है। जैसा कि दूसरों ने दिखाया है कि इसे काम करने के गणितीय तरीके हैं, जैसे मानक (और सामान्य उपयोग) विधियों का उपयोग करके एसक्यूएल में मुश्किल गणना करने के कई तरीके हैं।
नमूना डेटा:
Column
1
2
4
8
COUNT : 4 items (1 for each non-null)
SUM : 1 + 2 + 4 + 8 = 15
AVG : 3.75 (SUM/COUNT)
MUL : 1 x 2 x 4 x 8 ? ( =64 )
पूर्णता के लिए, Oracle, MSSQL, MySQL कोर कार्यान्वयन *
Oracle : EXP(SUM(LN(column))) or POWER(N,SUM(LOG(column, N)))
MSSQL : EXP(SUM(LOG(column))) or POWER(N,SUM(LOG(column)/LOG(N)))
MySQL : EXP(SUM(LOG(column))) or POW(N,SUM(LOG(N,column)))
- SQL सर्वर में EXP/LOG का उपयोग करते समय ध्यान रखें, रिटर्न प्रकार देखें http://msdn.microsoft.com/en-us/library/ms187592.aspx
- पावर फॉर्म बड़ी संख्या (यूलर की संख्या से बड़े आधारों का उपयोग करके) की अनुमति देता है, और ऐसे मामलों में जहां परिणाम पावर का उपयोग करके इसे वापस करने के लिए बहुत बड़ा हो जाता है, आप केवल लॉगरिदमिक मान वापस कर सकते हैं और वास्तविक संख्या की गणना कर सकते हैं SQL क्वेरी
* लॉग (0) और लॉग (-ve) अपरिभाषित हैं। नीचे केवल SQL सर्वर में इसे संभालने का तरीका दिखाया गया है। समान अवधारणा का उपयोग करते हुए, अन्य SQL फ्लेवर के लिए समतुल्य पाया जा सकता है
create table MUL(data int)
insert MUL select 1 yourColumn union all
select 2 union all
select 4 union all
select 8 union all
select -2 union all
select 0
select CASE WHEN MIN(abs(data)) = 0 then 0 ELSE
EXP(SUM(Log(abs(nullif(data,0))))) -- the base mathematics
* round(0.5-count(nullif(sign(sign(data)+0.5),1))%2,0) -- pairs up negatives
END
from MUL
सामग्री:
- डेटा का एब्स () लेना, यदि न्यूनतम 0 है, तो जो कुछ भी व्यर्थ है उसे गुणा करना, परिणाम 0 है
- जब डेटा 0 होता है, NULLIF इसे शून्य में बदल देता है। एब्स (), लॉग () दोनों अशक्त लौटते हैं, जिससे इसे योग से बाहर रखा जा सकता है ()
- यदि डेटा 0 नहीं है, तो एब्स हमें लॉग विधि का उपयोग करके एक ऋणात्मक संख्या को गुणा करने की अनुमति देता है - हम कहीं और नकारात्मकता का ट्रैक रखेंगे
- अंतिम संकेत तैयार करना
- साइन (डेटा) रिटर्न
1 for >0
,0 for 0
और-1 for <0
. के लिए । - हम एक और 0.5 जोड़ते हैं और फिर से साइन () लेते हैं, इसलिए हमने अब 0 और 1 दोनों को 1 और केवल -1 को -1 के रूप में वर्गीकृत किया है।
- COUNT() 1 से हटाने के लिए फिर से NULLIF का उपयोग करें, क्योंकि हमें केवल नकारात्मकों की गणना करने की आवश्यकता है।
% 2
नकारात्मक संख्याओं की गिनती () के विरुद्ध या तो वापस आती है- --> 1 अगर ऋणात्मक संख्याओं की विषम संख्या है
- --> 0 यदि ऋणात्मक संख्याओं की सम संख्या है
- अधिक गणितीय तरकीबें:हम 0.5 में से 1 या 0 लेते हैं, ताकि उपरोक्त बन जाए
- --> (
0.5-1=-0.5
=>गोल से -1 ) यदि ऋणात्मक संख्याओं की विषम संख्या है - --> (
0.5-0= 0.5
=>गोल से 1 ) यदि ऋणात्मक संख्याओं की सम संख्या है - हम वास्तविक परिणाम के लिए इस अंतिम 1/-1 को SUM-PRODUCT मान से गुणा करते हैं
- साइन (डेटा) रिटर्न