我目前正在两个日期之间从我的表中获取所有值。每天的值并不总是相同的,我需要每天对两个日期之间的值进行算术平均(不确定这是否是正确的术语)。
例如:
这是我表中的一些元素
['lig'] ['date']
170 2016-05-26
190 2016-05-26
192 2016-05-26
196 2016-05-25
181 2016-05-25
187 2016-05-25
195 2016-05-25
我需要做这样的事情:
平均第26天:170 + 190 + 192/3 = 184
平均每天25:196 + 181 + 187 + 195/4 = 189,75
这就是我如何获取日期之间的所有值。
function listDates($table, $beginDate, $endDate){
$select = "SELECT * FROM $tabela WHERE date >= :beginDate AND date <= :endDate ORDER BY date";
$inst = $this->liga->prepare($select);
$inst->bindParam(':beginDate', $begin);
$inst->bindParam(':endDate', $end);
$inst->execute();
return $inst->fetchAll();
}
这就是我如何得到我想要的日期间隔,并列出该间隔之间的值
$previous_week = strtotime("-1 week");
$today = strtotime("-1 day");
$start_week = strtotime("today", $previous_week);
$end_week = strtotime ("next day", $today);
$start_week = date("Y-m-d H:i:s", $start_week);
$end_week = date("Y-m-d H:i:s", $end_week);
$values = $listValues->listDates("meanVal",$start_week,$end_week);
foreach($values as $val){
echo $val['lig'];
echo $val['tip'];
echo $val['hum'];
echo $val['date'];
}
但是我如何计算(?)以获得每天的平均值?有人可以帮帮我吗? 不确定这是否明确,英语不是我的第一语言,有时我不知道如何解释一些东西。非常感谢。
答案 0 :(得分:1)
我会给你sql并让你自己弄清楚php部分:
select *,avg(lig) as day_mean
from table
where date >= begindate and date <= enddate
group by date
order by date
此处的关键是group by
子句,group by将为其后面的每个不同值应用聚合函数(此处avg
)(date
) 。
分组依据第一个字段对多个字段进行分组,第二个字段对等值组进行分组,等等。
有许多聚合函数可以与group by
一起使用,例如avg,sum,max,count,min等。
这里有几点说明:
1-我离开*
因为我认为你需要其他数据,如果你只需要平均值就可以删除它
2-上一代码中的as
关键字用于命名平均值(否则其名称为avg(lig)
),这是为了更好地命名在php部分,但它有另一个目的:如果你怎么办?只想平均大于X?或者对它有什么约束?然后你可以通过在前一个代码的末尾添加having day_mean>X
来实现这一目标(你可以把它放在那里,但它只用于聚合列,where
可以&#39 ; t用于那些列。)
3-在分组之前应用where
子句,这意味着mysql将首先选择满足where
子句的行然后将它们分组,这非常重要,因为这样只应用了聚合函数选定的行不在整个表格上。
答案 1 :(得分:0)
不确定您需要什么代码,但此查询会生成与您的示例相同的值:
$ mysql -e 'desc foo'
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| lig | int(11) | NO | | NULL | |
| date | date | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
$ mysql -e 'select sum(lig) as sum,
count(*) as ligs, sum(lig) / count(*) as average
from foo group by date '
+------+------+----------+
| sum | ligs | average |
+------+------+----------+
| 759 | 4 | 189.7500 |
| 552 | 3 | 184.0000 |
+------+------+----------+
答案 2 :(得分:0)
如果你不能改变其他答案中提到的查询,这里是获得所需结果的php代码。
php code
foreach($values as $val){
// generates array with date as key
$dates[$val['date']][] = $val['lig'];
}
foreach($dates as $k=>$v){
// calculates mean value for each date
$count = count($v);
$sum = array_sum($v);
$mean = $sum / $count;
echo $k.":".$mean;
}
Out put:
2016-05-26:184
2016-05-25:189.75