Вычисление медианы для столбцов mysql

У меня есть следующие столбцы в MySQL,

Площадь, цена, тип, квартал, год и т. Д.

Я пытаюсь вычислить медиану для каждой области (Juffair, Adliya, Mahooz) по этим условиям.

Типичный ряд будет выглядеть примерно так

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

То, что я хочу сделать, это отобразить таблицу с (Площадь — Медиана). Так что нужно взять весь Джуффайр и посчитать медиану. и т.п.

Что он делает: отображает каждую отдельную область (повторяющиеся времена) с ее ценой рядом с ней.

Двигаясь по петлям, я отображаю только области, но вычисляю медианы по всем областям, а не только ту, которую предполагается.

Любая помощь будет оценена.

<?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

Решение

Если вы хотите вычислить медиану в 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;

Приведенный выше запрос вычисляет медиану для всех данных. Первый подзапрос перечисляет значения, а второй получает общее количество.

Если вам нужен фильтр, например, по году, вам нужно добавить его в оба подзапроса.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector