两个日期之间每天的算术平均数



我目前正在从表中获取两个日期之间的所有值。每天的值并不总是相同的,我需要对两个日期之间的值进行算术平均(不确定这是否是正确的术语)。

例如:

这是我的表中的一些元素

['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'];     
} 

但是我怎样才能计数(?)来得到每天的平均值呢?有人能帮我吗?不确定这是否明确,英语不是我的第一语言,有时我不知道如何解释一些东西。非常感谢。

我会给你sql,让你自己计算php部分:

select *,avg(lig) as day_mean 
from table
where date >= begindate and date <= enddate
group by date
order by date

这里的关键是group by子句,groupby将对其后面的每个不同值(date)应用聚合函数(这里是avg)。

分组依据可以在多个字段上分组,由第一个字段分组,在相等值上分组由第二个字段分组和在相等等上分组

有许多聚合函数可以与group by一起使用,如avg、sum、max、count、min等。

这里有几个注意事项:
1-我离开*是因为我认为你需要其他数据,如果你只需要平均值,只需将其删除。
2-前一段代码中的as关键字用于命名平均值(否则其名称将为avg(lig)),这是为了在php部分更好地命名,但它有另一个目的:如果你只希望平均值大于X怎么办?或者有什么限制?然后通过将having day_mean>X添加到上一个代码的末尾来实现这一点(您可以将可以放在何处的内容放在后面,但它仅用于聚合列,where不能用于这些列)
3-在分组之前应用where子句,这意味着mysql将首先选择满足where子句的行,然后对它们进行分组,这一点非常重要,因为这样聚合函数只应用于选定的行,而不是整个表。

如果您不能更改其他答案中提到的查询,下面是获取所需结果的php代码。

  1. 创建一个以键为日期的新数组
  2. 计算每个日期的平均值

php代码

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

输出:

2016-05-26:184
2016-05-25:189.75

不确定代码方面需要什么,但此查询生成的值与您的示例相同:

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

最新更新