只是爲了好玩,我想我嘗試做這一切在MySQL中,這裏的sqlFiddle
SELECT
CASE
WHEN MOD((select count(*) as count from t),2)=1 THEN
(select val from
(select @row:[email protected]+1 as row,val
from t,(select @row:=0)r
order by val)t1
where t1.row = CEIL((select count(*) as count from t)/2)
)
ELSE
((select val from
(select @row:[email protected]+1 as row,val
from t,(select @row:=0)r
order by val)t1
where t1.row = (select count(*) as count from t)/2)+
(select val from
(select @row:[email protected]+1 as row,val
from t,(select @row:=0)r
order by val)t1
where t1.row = ((select count(*) as count from t)/2)+1))/2
END AS median
只需用表名稱取代t
OCCURENCES,不改變t1
。 另外,如果表中沒有行,它將返回NULL作爲中位數。
該查詢可以進一步降低到下述(sqlFiddle)
SELECT @rowCount:=(select count(*) as count from t) AS rowcount,
(select AVG(val) from
(select @row:[email protected]+1 as row,val
from t,(select @row:=0)r
order by val)t1
where t1.row IN (FLOOR((@rowCount+1)/2),
CEIL((@rowCount+1)/2)
)
) as Median
它會返回2列,一個rowcount
柱和median
柱。我把rowcount
列放在那裏,因爲我不想像以前的查詢那樣從多次計數。
如果你只是想在PHP中做到這一點,只需拔出所有的值,放入一個數組,排序數組,找到中位數。 – user602525
這不會很慢嗎?排序,然後找到中間值? – Ranveer
那麼,這取決於肯定的數據集。我只是基於現在的情況而定。 – user602525