嗨,我有一个包含以下数据的数据库:
表:“ history_data”
VALUE , DATE
100 , 2010-10-01 00:00:00
105 , 2010-10-01 00:00:05
106 , 2010-10-01 00:00:08
103 , 2010-10-01 00:00:10
如果我用MYSQL做一个简单的AVG(从“ history_data”中选择SELECT AVG('VALUE')AS CURRENT_AVG),结果为“ 103.5”,这是错误的,因为我需要基于日期时间的加权平均值(从2010-10-01开始) 00:00:05到2010-10-01 00:00:07值仍等于105)
在数学上执行此操作的正确操作是:
$values = [100,100,100,100,105,105,105,106,106,103];
echo array_sum($values) / count($values);
结果:103正确。...
我创建了两个带有值和日期索引的数组,另一个仅在php中具有dateinterval。比我合并和处理后要多。。。但是它要消耗大量资源。...(在生产中,我需要加权平均为12小时。43200秒...)
最有效的方法在哪里?
答案 0 :(得分:0)
您可以使用LAG()
函数并将权重乘以其值。
LAG()
答案 1 :(得分:0)
您可以使用mysql
select sum(value)/count(*)
from my_table
where date between now and DATE_SUB(NOW(), INTERVAL 12 HOUR)
答案 2 :(得分:0)
至少最有效的方法是在PHP中完成
$current_avg = $current_avg->fetchAll(PDO::FETCH_ASSOC);
$last_util_value = "";
$last_util_date = "";
$final_avg_array = array();
foreach ($current_avg as $key => $value) {
if(empty($last_util_value)){
$last_util_value = $value["val_ask"];
$last_util_date = strtotime($value["Date"]);
$second_time = $last_util_date - $past_time_second;
}else{
$second_time = strtotime($value["Date"]) - $last_util_date;
}
if($second_time > 0){
for ($i = 1; $i <= $second_time; $i++) {
array_push($final_avg_array,$value["val_ask"]);
}
}
$last_util_value = $value["val_ask"];
$last_util_date = strtotime($value["Date"]);
}
}
//6366.26937251
$avg = array_sum($final_avg_array) / count($final_avg_array);