Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एक क्वेरी कॉल में एक ही तालिका में एकाधिक स्तंभों के लिए माध्यिका की गणना करें

इस तरह की बात MySQL में गर्दन में बड़ा दर्द है। यदि आप इस सांख्यिकीय रैंकिंग कार्य का टन भार करने जा रहे हैं तो आप मुफ्त Oracle एक्सप्रेस संस्करण या पोस्टग्रेएसक्यूएल का उपयोग करने में बुद्धिमान हो सकते हैं। उन सभी के पास MEDIAN(value) . है कुल कार्य जो या तो अंतर्निहित हैं या एक्सटेंशन के रूप में उपलब्ध हैं। यहाँ एक छोटा सा sqlfiddle यह प्रदर्शित कर रहा है। http://sqlfiddle.com/#!4/53de8/6/0

लेकिन आपने इसके बारे में नहीं पूछा।

MySQL में, आपकी मूल समस्या @rownum जैसे चरों का दायरा है। आपको एक धुरी समस्या भी है:यानी, आपको अपनी क्वेरी की पंक्तियों को कॉलम में बदलना होगा।

आइए पहले धुरी समस्या से निपटें। आप जो करने जा रहे हैं वह कई बड़े मोटे प्रश्नों का एक संघ बनाना है। उदाहरण के लिए:

SELECT 'median_wages' AS tag, wages AS value
  FROM (big fat query making median wages) A
 UNION
SELECT 'median_volunteer_hours' AS tag, hours AS value
  FROM (big fat query making median volunteer hours) B
 UNION
SELECT 'median_solvent_days' AS tag, days AS value
  FROM (big fat query making median solvency days) C

तो यहाँ आपके परिणाम टैग / मान जोड़े की तालिका में हैं। प्रत्येक कॉलम में एक मान के साथ एक पंक्ति प्राप्त करने के लिए आप उस तालिका को इस तरह पिवट कर सकते हैं।

SELECT SUM( CASE tag WHEN 'median_wages' THEN value ELSE 0 END 
          ) AS median_wages, 
SELECT SUM( CASE tag WHEN 'median_volunteer_hours' THEN value ELSE 0 END
          ) AS median_volunteer_hours, 
SELECT SUM( CASE tag WHEN 'median_solvent_days' THEN value ELSE 0 END 
          ) AS median_solvent_days
FROM (
    /* the above gigantic UNION query */
 ) Q

इस तरह आप पंक्तियों (इस मामले में UNION क्वेरी से) को कॉलम में पिवट करते हैं। यहाँ विषय पर एक ट्यूटोरियल है। http://www.artfulsoftware.com/infotree/qrytip.php?id =523

अब हमें माध्यिका-कंप्यूटिंग उपश्रेणियों से निपटने की आवश्यकता है। आपके प्रश्न में कोड बहुत अच्छा लग रहा है। मेरे पास आपका डेटा नहीं है इसलिए मेरे लिए इसका मूल्यांकन करना कठिन है।

लेकिन आपको @rownum वेरिएबल का पुन:उपयोग करने से बचना होगा। अपने किसी एक प्रश्न में इसे @ rownum1 कहें, अगले में @ rownum2, इत्यादि। इनमें से सिर्फ एक कर रही एक डिंकी एसक्यूएल पहेली है। http://sqlfiddle.com/#!2/2f770/1/0

अब दो अलग-अलग माध्यिकाओं को करते हुए इसे थोड़ा सा बनाते हैं। यह रहा बेला http://sqlfiddle.com/#!2/2f770/2/ 0 और यहां यूनियन क्वेरी है। सूचना संघ क्वेरी का दूसरा भाग @rownum2 . का उपयोग करता है @rownum . के बजाय ।

अंत में, यहां पिवोटिंग के साथ पूरी क्वेरी है। http://sqlfiddle.com/#!2/2f770/13/0

 SELECT SUM( CASE tag WHEN 'Boston' THEN value ELSE 0 END ) AS Boston,
           SUM( CASE tag WHEN 'Bronx' THEN value ELSE 0 END ) AS Bronx   
   FROM (
 SELECT 'Boston' AS tag, pop AS VALUE
  FROM (
        SELECT @rownum := @rownum +1 AS  `row_number` , pop
          FROM pops, 
        (SELECT @rownum :=0)r
          WHERE pop >0 AND city = 'Boston'
          ORDER BY pop
        ) AS ordered_rows, 
        ( 
         SELECT COUNT( * ) AS total_rows
           FROM pops
          WHERE pop >0 AND city = 'Boston'
        ) AS rowcount
  WHERE ordered_rows.row_number = FLOOR( total_rows /2 ) +1
  UNION ALL
 SELECT 'Bronx' AS tag, pop AS VALUE
  FROM (
        SELECT @rownum2 := @rownum2 +1 AS  `row_number` , pop
          FROM pops, 
        (SELECT @rownum2 :=0)r
          WHERE pop >0 AND city = 'Bronx'
          ORDER BY pop
        ) AS ordered_rows, 
        ( 
         SELECT COUNT( * ) AS total_rows
           FROM pops
          WHERE pop >0 AND city = 'Bronx'
        ) AS rowcount
  WHERE ordered_rows.row_number = FLOOR( total_rows /2 ) +1
) D

यह सिर्फ दो माध्यिकाएं हैं। आपको पांच चाहिए। मुझे लगता है कि यह मामला बनाना आसान है कि यह औसत गणना एक ही प्रश्न में MySQL में करना बेहद मुश्किल है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql:शर्त के साथ दोहराए गए मानों वाली पंक्तियों को हटा दें (दोहराए गए कॉलम)

  2. MySQL उन पंक्तियों को छोड़ देता है जिन्हें उपयोगकर्ता पहले ही देखी गई तालिका की जाँच से देख चुका है

  3. ProxySQL ऑडिट लॉग को समझना

  4. गलत एन्कोडिंग में डालने के बाद MySQL डेटाबेस में डेटा अपडेट कर रहा है

  5. क्या MySQL अन्य DBMS की तुलना में काफी अधिक संसाधनों का उपभोग करता है?