MySQL

2012-01-18 5 views
5

में ट्रिम किए गए औसत गणना मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो MySQL में एक साधारण छंटनी औसत गणना की गणना करता हो। समारोह (स्पष्ट रूप से) एक समग्र कार्य होगा। मैं MySQL में फ़ंक्शन इत्यादि लिखने के लिए नया हूं इसलिए कुछ मदद के साथ ऐसा कर सकता है।MySQL

CREATE AGGREGATE FUNCTION trimmed_mean(elements DOUBLE[], trim_size INTEGER) 
RETURNS DOUBLE 
BEGIN 
    -- determine number of elements 
    -- ensure that number of elements is greater than 2 * trim_size else return error 
    -- order elements in ASC order 
    -- chop off smallest trim_size elements and largest trim_size elements 
    -- calculate arithmetic average of the remaining elements 
    -- return arithmetic average 
END 

किसी को भी कैसे फ़ंक्शन ठीक ऊपर लिखने के लिए, MySQL साथ प्रयोग के लिए के साथ मदद कर सकते हैं:

छंटनी मतलब के एल्गोरिथ्म के रूप में (स्यूडोकोड) इस प्रकार किया जाएगा?

+2

क्या कोई एक विशिष्ट कारण है कि आप इसे एक कार्य के रूप में कार्य के रूप में करना चाहते हैं? साथ ही, यह देखते हुए कि आपने पिछले प्रश्न का उत्तर पसंद किया क्योंकि यह मानक एसक्यूएल का इस्तेमाल करता है, क्या आपको इसे कई अलग-अलग आरडीबीएमएस (यानी न केवल MySQL) में उपयोग करने में सक्षम होना चाहिए? –

+0

@ मार्कबैनिस्टर मैं पीजी (मेरा पसंदीदा डीबी!) के साथ काम करना चाहता था, लेकिन मुझे PHP के साथ काम करने के लिए पीजी प्राप्त करने के लिए बहुत सारे हुप्स से कूदना पड़ा (PHP [या समान पागल पूछताछ] आदि को फिर से बनाना), इसलिए मैंने mySQL का चयन किया मैं पहले ही PHP के साथ काम कर रहा हूं। एक समारोह के रूप में मैं इसे चाहता था कि मैं एक प्रश्न में एक स्तंभ के रूप में एक छंटनी मतलब वापस करना चाहता हूँ। मुझे लगता है (अगर मेरे पास एक एसक्यूएल समाधान था), तो मैं कुछ एसक्यूएल को अपने लौटाए गए डेटासेट में कॉलम के रूप में छंटनी वाले औसत मानों को 'पेस्ट' करने के लिए एक साथ हैक कर सकता था। –

+0

@ मार्कबैनिस्टर: आपके प्रश्न का संक्षिप्त उत्तर। एक एएनएसआई एसक्यूएल संस्करण आदर्श होगा। लेकिन चूंकि मैं अपने एसक्यूएल के साथ काम कर रहा हूं, तो अगर मैं डीबी-केंद्रित होने के लिए __have__ करता हूं, तो एक MySQL स्वादित एसक्यूएल को प्राथमिकता दी जाएगी। –

उत्तर

1

कोई छोटी कार्य है कि, आप एक दृश्य या अदिश समारोह लिखने के लिए C/C++ में लिखने की जरूरत है ...


MySQL के भीतर ही एक विकल्प है, जो डेटा को आप जोड़ना चाहते हैं, लेकिन एक विशिष्ट तालिका से। यह स्पष्ट रूप से फ़ंक्शन को एकल स्रोत तालिका में प्रतिबंधित करता है, जो आदर्श नहीं हो सकता है।

इस के चारों ओर एक तरीका यह समारोह के लिए समर्पित एक मेज के लिए हो सकता है ...

  • तालिका
  • स्पष्ट लेन-देन शुरू
  • अपने नमूना डेटा
  • क्वेरी सम्मिलित देखें/फ़ंक्शन

(या कुछ समान)

यह ग्रुप बाय विविधताओं को रोकता है, जब तक कि आप विशिष्ट समूह पैटर्न के लिए अपने फ़ंक्शन में गतिशील एसक्यूएल या पास पैरामीटर का उपयोग न करें।

यह आदर्श, क्षमा से कम है।

+0

मुझे सी/सी ++ रूट (जैसे कि एक अंतिम उपाय) - लेकिन मैं नहीं बल्कि इसलिए, क्योंकि मैं अपने एसक्यूएल आंतरिक डेटा प्रकारों के साथ खुद को परिचित करने में घंटों खर्च नहीं करना चाहता हूं। यदि सी/सी ++ में लिखे गए कुल के लिए 'हैलो वर्ल्ड' उदाहरण है, तो एक बहुत अच्छा प्रारंभिक बिंदु (सीखने की वक्र को कम करने में) होगा, क्योंकि मैं जो करना चाहता हूं, अपेक्षाकृत मामूली (एल्गोरिदम भाग है) है। –

+0

डैम्स से लिंक में: * "MySQL स्रोत वितरण में एक फ़ाइल sql/udf_example.c शामिल है जो 5 नए कार्यों को परिभाषित करता है।" * –

1

(MySQL के लिए) इस उदाहरण पर एक नज़र डालें -

परीक्षण तालिका बनाएँ:

CREATE TABLE test_table (
    id INT(11) NOT NULL AUTO_INCREMENT, 
    value INT(11) DEFAULT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO test_table(value) VALUES 
    (10), (2), (3), (5), (4), (7), (1), (9), (3), (5), (9); 

की गणना करते हैं औसत मूल्य (संपादित संस्करण):

SET @trim_size = 3; 

SELECT AVG(value) avg FROM (
    SELECT value, @pos:[email protected] + 1 pos FROM (SELECT * FROM test_table ORDER BY value) t1, (SELECT @pos:=0) t2 
) t 
WHERE pos > @trim_size AND pos <= @pos - @trim_size; 

+--------+ 
| avg | 
+--------+ 
| 4.8000 | 
+--------+ 
+0

निश्चित रूप से यह 4.8 होना चाहिए - ट्रिम को एक को खत्म करना चाहिए, लेकिन दोनों 3s नहीं? यानी: (नहीं (1 + 2 + 3) + 3 + 4 + 5 + 5 + 7 + नहीं (9 + 9 + 10))/5 –

+0

@ मार्क बैनिस्टर आप सही हैं। मैंने एएससी आदेश में पॉइंट ऑर्डर तत्वों को याद किया है। इसे 'मान' फ़ील्ड द्वारा आदेश दिया जाना चाहिए। मैंने क्वेरी संपादित की है। धन्यवाद;-) – Devart