我有以下数组:
array(
a => 6.75,
b => 5.45,
c => 8.76,
d => 7.76,
e => 8.16,
f => 2.76,
g => 4.67,
h => 9.01,
i => 5.42,
)
我希望实现的目标是average
top quartile
。
本质上我需要按descending
顺序对数组进行排序,然后计算top quartile
将是什么(即9(数组中的元素数)x 25%= 2.25向下舍入到2,所以它是前两个需要平均的数字。)
这是我正在寻找的这个数字。
我正在努力弄清楚如何实现这一目标以及最好是在PHP中执行此操作还是通过查询MySQL数据库。
欢迎任何建议,反馈和建议。
答案 0 :(得分:2)
在MySQL中执行此操作会很困难,因为您不能直接使用变量LIMIT
。
然而,在那里进行它肯定是最有效的,而不是在你只需要一点时将所有数据传输到PHP。
因此,考虑到这一点,请尝试此算法:
SELECT COUNT(*)
获取行数$quartile_count
现在您需要一个嵌套查询:
SELECT AVG(`column_name`)
FROM (
SELECT `column_name`
FROM `table_name`
ORDER BY `column_name` DESC
LIMIT $quartile_count
) `tmp`
这是因为LIMIT
必须首先应用于汇总AVG
功能之前。
答案 1 :(得分:1)
$a = array(
'a' => 6.75,
'b' => 5.45,
'c' => 8.76,
'd' => 7.76,
'e' => 8.16,
'f' => 2.76,
'g' => 4.67,
'h' => 9.01,
'i' => 5.42,
);
rsort($a);
$sum = 0;
for($i = 0; $i < count($a) / 4; ++$i){
$sum += $a[$i];
}
$result = $sum / $i;
echo $result;
答案 2 :(得分:1)
您可以在PHP中轻松完成此操作:
$array = array(
a => 6.75,
b => 5.45,
c => 8.76,
d => 7.76,
e => 8.16,
f => 2.76,
g => 4.67,
h => 9.01,
i => 5.42,
);
arsort($array); // Order the array in descending order
$top_quartile = floor(count($array)/4); // Calculate top quartile
$array = array_slice($array, 0, $top_quartile); // Keep only the top quartile values
$total = 0;
foreach($array as $value) {
$total += $value;
}
$average = $total/$top_quartile;
echo $average;
答案 3 :(得分:1)
完成一个SQL: -
SELECT AVG(some_column)
FROM
(
SELECT some_column, @seq:=@seq+1 AS seq
FROM
(
SELECT some_column
FROM some_values
ORDER BY some_column DESC
) sub0
CROSS JOIN (SELECT @seq:=0) sub1
) sub2
CROSS JOIN
(
SELECT COUNT(*) AS all_count
FROM some_values
) sub3
WHERE sub3.all_count / 4 > sub2.seq
这有一个子查询以降序获取行,然后向其添加序列号,然后将其结果与获取记录总数的子查询交叉连接,具有WHERE子句以消除所有但是前四分之一然后使用AVG()来获得平均值。
更多的是出于兴趣,而不是作为一个实际的解决方案,因为我怀疑它会表现不佳。只有在需要它作为必须是单个查询的数据源时才真正有用。
答案 4 :(得分:0)
这是您问题的完整代码。
$rs = mysql_query("select count(column name) as total from table");
$result = mysql_fetch_row($rs);
$avg = floor($result[0]/4);
$rs = mysql_query("select column name from table order by column name desc limit 0,".$avg);
$total = 0;
while($result = mysql_fetch_array($rs))
{
$total += $result['column name'];
}
echo $total/mysql_num_rows($rs);