इस तरह की बात 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 में करना बेहद मुश्किल है।