繁体   English   中英

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

[英]arithmetic mean per day between two dates

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

例如:

这是我桌子的一些元素

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

但是我该如何做一个count(?)以获得每天的平均值? 有人可以帮助我吗? 不知道这是否是明确的,英语不是我的母语,有时我不知道该如何解释。 非常感谢。

我给你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将对之后的每个不同值( date )应用聚合函数(此处为avg )。

Group by可以对多个字段进行分组,第一个字段进行分组,第二个字段按相等的值分组,第二个字段按等号分组。

有许多可以与group by一起使用的聚合功能,例如avg,sum,max,count,min等。

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

不确定需要明智的代码,但是此查询产生的值与示例相同:

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

如果您无法更改其他答案中提到的查询,则以下是获得所需结果的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM