根据累计值按日期划分的PHP Mysql组
我有一个ID、value1、value2、value3和tstamp(时间戳格式)的表,我试图按每天分组并找到每天的总数,但是所有值都是累积的,这会带来一个问题,因为sum(value1)没有给出正确的输出,这是我的代码:根据累计值按日期划分的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);
$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 |
+--------------+----------+