आप MySQL में GROUP BY के साथ माध्यिका की गणना कर सकते हैं, भले ही कोई माध्यिका फ़ंक्शन अंतर्निहित न हो।
तालिका पर विचार करें:
Acrington 200.00
Acrington 200.00
Acrington 300.00
Acrington 400.00
Bulingdon 200.00
Bulingdon 300.00
Bulingdon 400.00
Bulingdon 500.00
Cardington 100.00
Cardington 149.00
Cardington 151.00
Cardington 300.00
Cardington 300.00
प्रत्येक पंक्ति के लिए आप समान वस्तुओं की संख्या गिन सकते हैं जो कम हैं। आप यह भी गिन सकते हैं कि कितने मान इससे कम या बराबर हैं:
name v < <=
Acrington 200.00 0 2
Acrington 200.00 0 2
Acrington 300.00 2 3
Acrington 400.00 3 4
Bulingdon 200.00 0 1
Bulingdon 300.00 1 2
Bulingdon 400.00 2 3
Bulingdon 500.00 3 4
Cardington 100.00 0 1
Cardington 149.00 1 2
Cardington 151.00 2 3
Cardington 300.00 3 5
Cardington 300.00 3 5
क्वेरी के साथ
SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
, (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
FROM sale o
माध्यिका मान तब होगा जब कम-से-या-बराबर गणना मदों की संख्या से आधी होगी
-
एक्रिंगटन 4 आइटम हैं। इसमें से आधा 2 है जो 0..2 (200.00 के अनुरूप) की सीमा में है और 2..3 (300.00 के अनुरूप) की सीमा में भी है
-
बुलिंगडन 4 आइटम भी हैं। 2 रेंज में है 1..2 (मान 300.00) और 2..3 (मान 400.00)
-
कार्डिंगटन 5 आइटम हैं। मान 2.5 2 और 3 के बीच है जो कार्डिंगटन 151 से मेल खाता है।
माध्यिका मान निम्न द्वारा लौटाए गए न्यूनतम और अधिकतम मानों का माध्य है:
SELECT cs.name,v
FROM
(SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
, (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
FROM sale o) cs JOIN
(SELECT name,COUNT(1)*.5 as cn
FROM sale
GROUP BY name) cc ON cs.name=cc.name
WHERE cn between ls and lse
जो देता है:
Acrington 200.00
Acrington 200.00
Acrington 300.00
Bulingdon 300.00
Bulingdon 400.00
Cardington 151.00
अंत में हम माध्यिका प्राप्त कर सकते हैं:
SELECT name,(MAX(v)+MIN(v))/2 FROM
(SELECT cs.name,v
FROM
(SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
, (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
FROM sale o) cs JOIN
(SELECT name,COUNT(1)*.5 as cn
FROM sale
GROUP BY name) cc ON cs.name=cc.name
WHERE cn between ls and lse
) AS medians
GROUP BY name
देना
Acrington 250.000000
Bulingdon 350.000000
Cardington 151.000000