计算列mysql的中位数

时间:2014-09-14 08:49:19

标签: php mysql median

我在mysql中有以下列,

面积,价格,类型,季度,年份等。

我想做的是在这些条件下计算每个区域(Juffair,Adliya,Mahooz)的中位数。

典型的行看起来像这样

Burhama, 500, Apartment, 3, 2014..
Burhama, 600, Apartment, 3, 2014
Juffair, 800, Apartment, 3, 2014 etc.

我想要它做的是显示一个表(区域 - 中位数)。所以它应该采取所有的Juffair并计算中位数。等。

它正在做的是:用它旁边的价格显示每个区域(重复的时间)。

在循环中移动,我只显示区域,但计算所有区域的中位数,而不仅仅是它所假设的位置。

任何帮助将不胜感激。

<?php
function calculate_median($arr) {
sort($arr);
$count = count($arr); //total numbers in array
$middleval = floor(($count-1)/2); // find the middle value, or the lowest middle value
if($count % 2) { // odd number, middle is the median
    $median = $arr[$middleval];
} else { // even number, calculate avg of 2 medians
    $low = $arr[$middleval];
    $high = $arr[$middleval+1];
    $median = (($low+$high)/2);
}
return $median;
}
?>


<?php

$array = array('Juffair', 'Adliya', 'Mahooz', 'Burhama' , 'Manama');
$price = array();
//connect
$data = mysql_query("SELECT * FROM stats 
WHERE `rentsale` = 'Rent'
and `type` = 'Apartment' 
and `area` IN('".implode("', '", $array)."') 
and `beds` = '2' 
and `quarter` = '3' 
and `year` = '2014'") 
//die
while($info = mysql_fetch_array( $data )) {

$area = $info['area'];
$array = array('Juffair', 'Adliya', 'Mahooz', 'Burhama' , 'Manama');
foreach( $array as $area ) {
$price[] = $info['price']; 
$home_values_array = $price;
$median_home_value = calculate_median($home_values_array);
}
?>
<table>
<tr>
<TD><?php echo $area; ?></TD>
<TD><?php echo $median_home_value; ?></TD>
</tr>
</table>
<?php

}


 ?> 

1 个答案:

答案 0 :(得分:2)

如果你想计算MySQL中的中位数,我会建议使用变量(参考的答案都没有提到):

select area, avg(price) as median
from (select s.*,
             (@rn := if(@a = area, @rn + 1,
                        if(@a := area, 1, 1)
                       )
             ) seqnum
      from stats s cross join
           (select @a := '', @rn := 0) vars
      order by area, price
     ) s join
     (select area, count(*) as cnt
      from stats
      group by area
     ) a
     on s.area = a.area
where 2*seqnum in (cnt - 1, cnt, cnt + 1)
group by area;

上述查询计算所有数据的中位数。第一个子查询枚举值,第二个子查询得到总计数。

如果您想要过滤器,例如年份,则需要将其添加到两个子查询中。