上次发过一个按当天分组取值的,今天发个隔天取值。
表名t_201012,结构如下,
id group1 obj date_time obj_value
1 一楼 房间1 2010-12-01 00:00:00 10
2 一楼 房间2 2010-12-01 00:00:00 15
3 一楼 房间3 2010-12-01 00:00:00 15
4 二楼 房间1 2010-12-01 00:00:00 20
5 二楼 房间2 2010-12-01 00:00:00 10
6 一楼 房间1 2010-12-01 23:00:00 20
7 一楼 房间2 2010-12-01 23:00:00 25
8 一楼 房间3 2010-12-01 23:00:00 20
9 二楼 房间1 2010-12-01 23:00:00 30
10 二楼 房间2 2010-12-02 23:00:00 30
11 一楼 房间1 2010-12-02 00:00:00 20
12 一楼 房间2 2010-12-02 00:00:00 25
13 一楼 房间3 2010-12-02 00:00:00 25
14 二楼 房间1 2010-12-02 00:00:00 30
15 二楼 房间2 2010-12-02 00:00:00 20
16 一楼 房间1 2010-12-02 23:00:00 30
17 一楼 房间2 2010-12-02 23:00:00 35
18 一楼 房间3 2010-12-02 23:00:00 30
19 二楼 房间1 2010-12-02 23:00:00 40
20 二楼 房间2 2010-12-02 23:00:00 40想分别按"group1"和date_time(yyyy-MM-dd)分组后,取该天最大时间分组下,所有obj_value之和,与上一天最大时间分组下,所有obj_value之和,最后取两者之差。例如,在上表中,2010-12-02的最大时间分组是2010-12-02 23:00:00,2010-12-01的最大时间分组是2010-12-01 23:00:00,按group1分组后,一楼2010-12-02最大时间分组之和为(30+35+30=95),一楼2010-12-01最大时间分组之和为(20+25+20=65),两者之差为(95-65=30).
实现后的样子如下:
gourp1 date_time cha_value
一楼 2010-12-01 null
二楼 2010-12-01 null
一楼 2010-12-02 30
二楼 2010-12-02 20另,数据按月分表,2010-12-01 要取t_201011表中11月30号的数据,即跨表计算。当找不到上一天的数据时,cha_value设为Null。
表名t_201012,结构如下,
id group1 obj date_time obj_value
1 一楼 房间1 2010-12-01 00:00:00 10
2 一楼 房间2 2010-12-01 00:00:00 15
3 一楼 房间3 2010-12-01 00:00:00 15
4 二楼 房间1 2010-12-01 00:00:00 20
5 二楼 房间2 2010-12-01 00:00:00 10
6 一楼 房间1 2010-12-01 23:00:00 20
7 一楼 房间2 2010-12-01 23:00:00 25
8 一楼 房间3 2010-12-01 23:00:00 20
9 二楼 房间1 2010-12-01 23:00:00 30
10 二楼 房间2 2010-12-02 23:00:00 30
11 一楼 房间1 2010-12-02 00:00:00 20
12 一楼 房间2 2010-12-02 00:00:00 25
13 一楼 房间3 2010-12-02 00:00:00 25
14 二楼 房间1 2010-12-02 00:00:00 30
15 二楼 房间2 2010-12-02 00:00:00 20
16 一楼 房间1 2010-12-02 23:00:00 30
17 一楼 房间2 2010-12-02 23:00:00 35
18 一楼 房间3 2010-12-02 23:00:00 30
19 二楼 房间1 2010-12-02 23:00:00 40
20 二楼 房间2 2010-12-02 23:00:00 40想分别按"group1"和date_time(yyyy-MM-dd)分组后,取该天最大时间分组下,所有obj_value之和,与上一天最大时间分组下,所有obj_value之和,最后取两者之差。例如,在上表中,2010-12-02的最大时间分组是2010-12-02 23:00:00,2010-12-01的最大时间分组是2010-12-01 23:00:00,按group1分组后,一楼2010-12-02最大时间分组之和为(30+35+30=95),一楼2010-12-01最大时间分组之和为(20+25+20=65),两者之差为(95-65=30).
实现后的样子如下:
gourp1 date_time cha_value
一楼 2010-12-01 null
二楼 2010-12-01 null
一楼 2010-12-02 30
二楼 2010-12-02 20另,数据按月分表,2010-12-01 要取t_201011表中11月30号的数据,即跨表计算。当找不到上一天的数据时,cha_value设为Null。
解决方案 »
- [mysql问题]局域网内有两台机子装了mysql,但是不能远程登录
- sqlite 如何实现查询结果将其累加结果统计出来呢?坐等答案。
- 检查数据表中某个变量字段是否存在。
- [求助]换了nginx前端 后端 Apache 进不了后台了!
- 这SQL语句。。。能用索引优化吗
- information_schema中有错误数据怎么修复?
- 怎样将图片存入mysql数据库???在线等(最好能用servlet代码写出来),谢谢!!!!!!!!!
- 为什么在MYSQL中新建的用户无法登录?
- 阿里云服务器 mysql5.6版本更新报错
- mysql5.6.24怎么修改端口号
- if EXISTS( SELECT @x=id FROM a_usercheck WHERE guid = gid)...如何同时取值?
- MySQL的命令行程序就是控制台吧?
一楼 2010-12-01 null
二楼 2010-12-01 null
一楼 2010-12-02 30
二楼 2010-12-02 20这个二楼 2010-12-02 20是怎么算出来的?!
建议楼主要提供例子的时候自己先验证一下,否则是浪费所有人的时间。select t1.group1,t1.cdate AS date_time,(t1.ovalue-t2.ovalue) AS cha_value
from (
Select group1,date(date_time) as cdate,sum(obj_value) as ovalue
from t_201012 a
where not Exists (select 1 from t_201012 where group1=a.group1 And date(date_time)=date(a.date_time) and date_time>a.date_time)
group by group1,date(date_time)
) t1 left join (
select group1,DATE(date_time) as cdate,sum(obj_value) as ovalue
from t_201012 a
where Not exists (select 1 from t_201012 where group1=a.group1 And date(date_time)=date(a.date_time) and date_time>a.date_time)
group by group1,date(date_time)
) t2 on (t1.group1=t2.group1 and t1.cdate=t2.cdate+interval 1 day)
order by 2
SELECT A.GROUP1,A.NEWD,A.NEWO-B.NEWO FROM (
SELECT a.group1,DATE(a.date_time) AS NEWD,SUM(a.obj_value) AS NEWO FROM ttr a
INNER JOIN
(SELECT group1,DATE(date_time),MAX(date_time) AS ma FROM ttr GROUP BY group1,DATE(date_time)) b
ON a.group1=b.group1 AND a.date_time=b.ma GROUP BY a.group1,DATE(a.date_time)) a
LEFT JOIN
(
SELECT a.group1,DATE(a.date_time) AS NEWD,SUM(a.obj_value) AS NEWO FROM ttr a
INNER JOIN
(SELECT group1,DATE(date_time),MAX(date_time) AS ma FROM ttr GROUP BY group1,DATE(date_time)) b
ON a.group1=b.group1 AND a.date_time=b.ma GROUP BY a.group1,DATE(a.date_time)) b
ON DATE_ADD(A.NEWD,INTERVAL -1 DAY)=B.NEWD AND A.GROUP1=B.GROUP1 ORDER BY A.NEWD,A.GROUP1
在示例中,2010-12-01 和2010-12-02的最大时间都是23:00:00 ,因此,
一楼2010-12-01 最大时间之和为(20+25+20=65,即id=6、7、8所在行之和)
二楼2010-12-01 最大时间之和为(30+30=60,即id=9、10所在行之和)
一楼2010-12-02 最大时间之和为(30+35+30=95,即id=16、17、18所在行之和)
二楼2010-12-02 最大时间之和为(40+40=80,即id=19、20所在行之和)
在此基础上,用每天最大时间之和减去上一天最大时间之和得到最终结果(如果没有上一天的值,就赋空值,因没有2010-11-30的数据,因此2010-12-01的cha_value为null),所以最终结果为:
gourp1 date_time cha_value
一楼 2010-12-01 null
二楼 2010-12-01 null
一楼 2010-12-02 30
二楼 2010-12-02 20
另外,如果2010-11-30有数据,就要考虑跨月计算。
二楼2010-12-01 最大时间之和为(30+30=60,即id=9、10所在行之和)仔细看一下你的 id=9、10所在行 的日期
一楼 2010-12-01 null
二楼 2010-12-01 null
一楼 2010-12-02 30
二楼 2010-12-02 20
4楼代码结果