2012-08-04 8 views
10

मैं (अधिक जानकारी के लिए docs देख)क्या MySQL के पास ओरेकल के "विश्लेषणात्मक कार्य" के बराबर है?

विश्लेषणात्मक कार्यों पंक्तियों के एक समूह के आधार पर एक समग्र मूल्य की गणना MySQL में PARTITION BY तरह विश्लेषणात्मक समारोह के लिए देख रहा हूँ। वे कुल कार्यों से भिन्न होते हैं कि वे प्रत्येक समूह के लिए एकाधिक पंक्तियां लौटाते हैं।

क्या यह अस्तित्व में है?

+0

यदि यह विंडिंग फ़ंक्शंस की तरह है, तो नहीं: http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems – ripper234

+2

यदि आप ओपन सोर्स डेटाबेस में विंडोिंग फ़ंक्शन चाहते हैं तो आपको PostgreSQL का उपयोग करने की आवश्यकता होगी। –

उत्तर

12

नहीं, यह एमएसएसएलएल, ओरेकल, पोस्टग्रेएसक्यूएल जैसे अन्य डीबीएमएस की तुलना में MySQL की मुख्य कमी में से एक है। मुझे किसी भी भविष्य में माईएसक्यूएल में विंडो फ़ंक्शंस को देखने में दृढ़ता से संदेह है, विशेष रूप से ओरेकल के MySQL अधिग्रहण के बाद ...

+1

MySQL में पुनरावर्ती प्रश्नों की भी कमी है –

+0

क्या मुझे कुछ याद आ रहा है या यह आलेख mysql के लिए विश्लेषणात्मक कार्यों का वर्णन कर रहा है: http://explainextended.com/2009/03/10/analytic-functions-first_value-last_value-lead-lag/ ??? ? –

+1

आह, अब मैं समझता हूं, यह विश्लेषणात्मक कार्यों का वर्णन कर रहा है और फिर वर्णन करता है कि उनके बिना समान परिणामों को कैसे प्राप्त किया जा सकता है ... –

-3

SQL सर्वर के लिए एक वाणिज्यिक उत्पाद है जो डेटाबेस विश्लेषणात्मक कार्यों को प्रदान करता है और इसे किसी ऑरैकल से जोड़ा जा सकता है या 'जुड़ा हुआ सर्वर/ODBC के माध्यम से MySQL डेटाबेस - यहाँ एक लेख के रूप में वर्णन किया गया है: http://westclintech.com/Blog/tabid/132/EntryId/88/Using-XLeratorDB-with-MySQL-and-other-RDBMS-s.aspx

यह एक Windows ओ/s और SQL सर्वर 2005 या बाद में (जो एक्सप्रेस संस्करण नि: शुल्क है)

17

बस होने की आवश्यकता है आपको बताना चाहता था कि आप विश्लेषणात्मक कार्यों की नकल करने के लिए MySQL में चर का उपयोग कर सकते हैं।

 

SELECT amount, 
    @sum := @sum + amount as sum 
FROM tbl 
JOIN (SELECT @sum := 0) s 
 

आप PARTITION BY चाहते हैं, यह संभव है, लेकिन सिर्फ एक थोड़ा और अधिक जटिल: योग से अधिक, उदाहरण के लिए, इस प्रकार किया जा सकता है। असल में, आप खाता (या जो भी आप विभाजन करना चाहते हैं) को देखने के लिए एक और @variable जोड़ते हैं, खाता (या आपके चर) द्वारा क्रमबद्ध करें, और फिर खाते में परिवर्तन होने पर @sum को रीसेट करें। इस प्रकार है:

 

SELECT account, 
    amount, 
    (case when @account != account then @sum := amount else @sum := @sum + amount end) as sum, 
    (case when @account != account then @account := account else @account end) as _ 
FROM (SELECT * FROM tbl ORDER BY account) 
JOIN (SELECT @sum := 0) s 
JOIN (SELECT @account := '') a 
 

आप दो बड़े बदलाव है कि विभाजन प्रभाव पूरा करने के लिए किया जाना था ध्यान दें होगी:

  1. मुख्य तालिका (tbl) एक उप में encased है एक ORDER BY साथ चयन खंड। यह जरूरी है क्योंकि जब MySQL @account परिवर्तनीय परीक्षण करने के लिए जाता है तो मानों को पहले से ही आदेश दिया जाना आवश्यक है। यदि ऐसा नहीं होता है, तो आपको गलत योग मान और खाता मान भी मिलेंगे।

  2. एक 'अतिरिक्त' कॉलम as _ उपनाम है। परिणाम का उपयोग करते समय आप इस कॉलम को अनदेखा कर सकते हैं, लेकिन @account का ऑर्डर चेक और चेंज @sum चेक और चेंज के बाद होना चाहिए।

    इसके साथ ही, यदि आप खाते को अंतिम नहीं मानते हैं तो आप अपने कॉलम को फिर से व्यवस्थित करना चुन सकते हैं। यह पहले account कॉलम को निकालकर किया जाता है क्योंकि यह अंतिम _ कॉलम के साथ डुप्लीकेट करता है और फिर स्पष्ट रूप से एलियाज्ड _ से account का नाम बदल दिया जाता है।

संसाधन:

+4

यह स्वीकार्य उत्तर होना चाहिए था। मुझे समझ में नहीं आता * क्यों * यह काम करता है, यह जादू लॉल की तरह है। – Phrancis

0

हालांकि MySQL विश्लेषणात्मक कार्यों का समर्थन नहीं करता, MariaDB करता है। यह MySQL के लिए एक ड्रॉप-इन प्रतिस्थापन है और MySQL के मूल डेवलपर्स द्वारा बनाया गया है।

संबंधित मुद्दे