You can calculate the median with GROUP BY in MySQL, even if it does not have a median.
Consider the table:
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
For each row, you can count the number of similar elements that are smaller. You can also calculate how many values ββare less than or equal to:
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
With request
SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<ov AND name=o.name) as ls , (SELECT COUNT(1) FROM sale WHERE v<=ov AND name=o.name) as lse FROM sale o
An average value will occur if the quantity is less than or equal to half the number of elements
Acrington has 4 elements. Half of this is 2, which is in the range 0..2 (corresponds to 200.00), as well as in the range 2..3 (corresponds to 300.00)
Bullingdon also has 4 elements. 2 is in the range 1..2 (value 300.00) and 2..3 (value 400.00)
Cardington has 5 elements. A value of 2.5 is between 2 and 3, which corresponds to Cardington 151.
The average value is the average value of min and max returned:
SELECT cs.name,v FROM (SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<ov AND name=o.name) as ls , (SELECT COUNT(1) FROM sale WHERE v<=ov 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
What gives:
Acrington 200.00 Acrington 200.00 Acrington 300.00 Bulingdon 300.00 Bulingdon 400.00 Cardington 151.00
Finally, we can get the median:
SELECT name,(MAX(v)+MIN(v))/2 FROM (SELECT cs.name,v FROM (SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<ov AND name=o.name) as ls , (SELECT COUNT(1) FROM sale WHERE v<=ov 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
Provision
Acrington 250.000000 Bulingdon 350.000000 Cardington 151.000000