根据累计值按日期划分的PHP Mysql组

根据累计值按日期划分的PHP Mysql组,php,mysql,math,Php,Mysql,Math,我有一个ID、value1、value2、value3和tstamp(时间戳格式)的表,我试图按每天分组并找到每天的总数,但是所有值都是累积的,这会带来一个问题,因为sum(value1)没有给出正确的输出,这是我的代码: $sql = "select date(tstamp), sum(".$column.") from mash group by date(tstamp) order by tstamp asc limit 10"; $result = mysql_query($sql);

我有一个ID、value1、value2、value3和tstamp(时间戳格式)的表,我试图按每天分组并找到每天的总数,但是所有值都是累积的,这会带来一个问题,因为sum(value1)没有给出正确的输出,这是我的代码:

$sql = "select date(tstamp), sum(".$column.") from mash group by date(tstamp) order by tstamp asc limit 10";
$result = mysql_query($sql);
$previous = 0;
$firstRun = true;
while($row = mysql_fetch_array($result))
{
  $difference = $row[1] - $previous;
  if (!$firstRun)
  {
     $strXML .= "<set name='".$row[0]."' value='".$difference."' color='AFD8F8' />";
   }
  $previous = $row[1];
  $firstRun = false;
}

如果按日期分组,它将按日期的最小增量分组。您应该按日期的日期分组。比如:

select DATE_FORMAT(tstamp, '%Y-%m-%c') as ymd, sum(".$column.") from mash group by ymd order by tstamp asc limit 10
这将给你一个年-月-日期格式,它将分组。如果需要单独访问年、月和日值,请执行以下操作:

select YEAR(tstamp) as year, MONTH(tstamp) as month, DAY(tstamp) as day, sum(".$column.") from mash group by year, month, day order by tstamp asc limit 10

你的问题的关键部分不是“分组依据”部分,这将很好地发挥作用,而是你所说的累积

如果你的意思是某一列记录了一年中每天的总降雨量(也就是说,由于两个记录之间的差值是当天发生的实际降雨量,因此该数字一直在上升),那么你需要做的是首先消除该差值。不管你怎么做,SQL都会有点毛茸茸的,所以你最好还是用PHP来做,但这里我试着用SQL

create temporary table foo select * from bar;

create temporary table non_accumulative
select b.id, b.rain - f.rain as "rain", rain_timestamp from bar b join foo f on (f.id + 1) = b.id;

select sum(rain), date(rain_timestamp) from non_accumulative group by date(rain_timestamp) order by rain_timestamp;

当然,您也可以对子选择执行同样的操作,但我发现临时表更快。

假设我正确读取了您的表,您正在查找“value1”(或value2,等等)的最后一个条目,它实际上是总和(根据您提到的累计值判断)

这将产生:

+--------------+----------+
| DATE(tstamp) | MAX(val) |
+--------------+----------+
| 2010-01-02   |       20 |
| 2010-01-03   |       20 |
| 2010-02-01   |       64 |
+--------------+----------+

你不能按
DATE(tstamp)
分组,然后按最后一个条目排序,该条目将具有你要查找的值吗?我不知道为什么它不起作用,但在某些方面,它会给出负结果,这肯定是不对的。我也试过desc和ascwork@benhowdle89:我正在我的终端上填充一个演示数据库,所以我有一些东西要测试。假设您每天从最新(最后插入的)条目中获取“value1”、“value2”等信息是否安全(因为最后插入的条目始终是上一个加上新值)?嗨,Brad,感谢您花时间回答这个问题,请参阅我编辑的答案:)@benhowdle现在查看了它,我相信您正在查找每列的MAX(),按日期分组(tstamp)。e、 g.
按日期(tstamp)选择日期(tstamp),最大(蒸汽)作为mash组的最大蒸汽(tstamp)
fyi,函数执行与DATE_FORMAT.Hmm相同的结果,谢谢,这与我上面的代码有什么关系?基本上是为了替换SQL查询本身。很抱歉,我错过了你描述的累计部分,我看到你有一个有效的答案嗨,布拉德,我知道你给了我一个完整的答案,但我有一个想法。因为每个值总是大于它之前的值(它也不会重置)。我看到出现的问题是,第一天的最大值是3456(因此那天的总数),第二天将从3456开始,并且只会增加。因此,我绘制的图表一直在增加,因为每个总数也是从前一天开始添加的!这有意义吗?有办法吗?
+----+------+---------------------+
| id | val  | tstamp              |
+----+------+---------------------+
|  6 |    1 | 2010-01-02 01:00:00 |
|  7 |    4 | 2010-01-02 02:00:00 |
|  8 |    6 | 2010-01-02 03:00:00 |
|  9 |   15 | 2010-01-02 04:00:00 |
| 10 |   20 | 2010-01-02 05:00:00 | <-- this value
| 11 |    1 | 2010-01-03 01:00:00 |
| 12 |    4 | 2010-01-03 02:00:00 |
| 13 |    6 | 2010-01-03 03:00:00 |
| 14 |   15 | 2010-01-03 04:00:00 |
| 15 |   20 | 2010-01-03 05:00:00 | <- this value
|  1 |    2 | 2010-02-01 01:00:00 |
|  2 |    8 | 2010-02-01 02:00:00 |
|  3 |   16 | 2010-02-01 03:00:00 |
|  4 |   32 | 2010-02-01 04:00:00 |
|  5 |   64 | 2010-02-01 05:00:00 | <- this value
+----+------+---------------------+
SELECT    DATE(tstamp), MAX(val)
FROM      mash
GROUP     DATE(tstamp)
ORDER BY  tstamp ASC;
+--------------+----------+
| DATE(tstamp) | MAX(val) |
+--------------+----------+
| 2010-01-02   |       20 |
| 2010-01-03   |       20 |
| 2010-02-01   |       64 |
+--------------+----------+