2014-09-14 3 views
1

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

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

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

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

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

То, что я хочу, чтобы это сделать, это отобразить таблицу с (Area - Median). Поэтому он должен взять все 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 

} 


?> 
+0

Возможно, вы должны сделать это в SQL, вот пример того, как вычислять медианы в любой SQL-RDBMS: http://stackoverflow.com/a/7263925/3227403 – pid

+0

Вы можете использовать SQL для этих вычислений для вас, а не для цикл через результирующие множества. Посмотрите на эти ответы. http://stackoverflow.com/a/1291296/32763 – Loopo

+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; 

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

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

+0

Спасибо, понял. –

+0

Я немного потерялся здесь, не проделав этого так раньше. Можете ли вы сказать мне, где мне нужно ввести предложение WHERE? –

+0

@JohanFourie. , , Вам нужно будет добавить предложение 'where' для обоих подзапросов. –

Смежные вопросы