可以计算与GROUP BY在MySQL中位数即使是没有内置位机能
考虑表:
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
中值当低于或相等计数的项目数的一半
Acrington有4个项目。的这一半是2这是在(对应于200.00)的范围0..2以及在(对应于300.00)的范围2..3
Bullingdon也有4个项目。 2在范围1..2(值300.00)和2..3(值400.00)
Cardington有5项。值2.5在2和3之间,对应于Cardington 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
mysql中没有中位数函数 – 2013-10-29 09:33:21
是否必须处于同一个查询中?如果可以运行第二个查询,则可以计算该集合的中点,以知道数据点的数量。中点是一行或两行。运行相同的查询,但添加LIMIT [中点],[中点mod 2]并返回平均值。 – 2013-10-30 06:50:56
如果你这样做,你将不得不改变顺序 - 我假设你想要QNTY_Sell/QNTYDelivered的中位数,所以你必须命令它来找到中点。 – nickL 2014-01-22 18:50:06